2012-03-20 65 views
1

我试图找到两个用户分开的联盟(lid)。mysql select matching results

这里是我的表:

表联赛:

*id* lname 
-------------- 
1  Hard C 
3  Fun 
5  Crazy 

表匹配:

*userid* *lid* 
----------------- 
    1   1 
    4   5 
    1   3 
    2   1 
    4   1 
    4   3 

*是主键

match.lid是外键leagues.id(用户不能不是同一联盟的两倍)

这里是我到目前为止(开始):

SELECT t1.lid, t2.lname 
FROM match t1 
JOIN leagues t2 on t1.lid = t2.id 

到目前为止,我设法连接两个表,并获得名字。我的最终目标是显示lid的其中两个用户是同一个联赛的一部分,比方说userid 1和4

userid 1是lid 1和3

userid 4的成员是其成员lid 5,1和3

两个用户都在联赛中满足(lid)1和3

所以我需要一个查询,显示仅在两个用户满足的联赛。就像这样:

lid lname 
-------------- 
1  Hard C 
3  Fun 

由于userid 1和4,在联赛1和3相遇,结果应该显示。我可以为每个用户运行两个查询,并检查哪两个用户通过php会面,但我认为运行一个查询会更有效率。

回答

0
SELECT m1.lid, l.lname FROM 
`match` m1, `match` m2, leagues l 
WHERE m1.lid = m2.lid AND m1.lid = l.id 
    AND m1.userid = 1 
    AND m2.userid = 4 
+0

简单快速的查询花费了0.0004秒 – user962449 2012-03-20 20:42:16

0

有几种方法。最直接的是:

SELECT id AS lid, 
     lname 
    FROM leagues 
WHERE id IN 
     (SELECT lid 
      FROM match 
      WHERE userid = 1 
     ) 
AND id IN 
     (SELECT lid 
      FROM match 
      WHERE userid = 4 
     ) 
; 

另一种方式,这是一个有点不那么直接,但可以有更好的表现—你可以尝试一下,看看—是使用JOIN

SELECT id AS lid, 
     lname 
    FROM leagues 
    JOIN match AS match1 
    ON match1.lid = leagues.id 
    AND match1.userid = 1 
    JOIN match AS match2 
    ON match2.lid = leagues.id 
    AND match2.userid = 4 
;