如何从MySQL中另一个表筛选的一个表中选择行?

时间:2013-01-16 22:16:53

标签: php mysql select

我有一个表成员

member_id, points

我还有另一张桌子投注

member_id, finished

考虑关注表成员的数据:

1 0
2 15000
3 0

对于投注

1 -1
1  0
2  1
3  1
3 -1

在表格中投注完成= -1表示投注失败,0表示未完成,1表示赢。 如何选择有0分且所有投注都已完成的会员ID?根据我给出的数据,它应该返回一行,其成员id = 3。

5 个答案:

答案 0 :(得分:3)

您可以使用EXISTS子句:

select members.id
from members
where
  points=0
  and not exists (select null from bets where bets.id=members.id and status=0)

您也可以使用LEFT JOIN:

select members.id
from
  members left join bets
  on members.id = bets.id
     and bets.status=0
where
  bets.id is null
  and members.points=0

答案 1 :(得分:0)

使用JOIN,如下所示:

select members.member_id, members.points, bets.finished
  from members
  join bets on bets.member_id = members.member_id
  where bets.finished <> 0 and members.points = 0;

答案 2 :(得分:0)

您可以使用内部联接

SELECT member_id FROM members m
INNER JOIN bets b
ON m.member_id = b.member_id
WHERE b.finished = 0 AND m.points = 0
  

内部联接是应用程序中使用的最常见的联接操作,可以视为默认的联接类型。内连接通过基于连接谓词组合两个表(A和B)的列值来创建新的结果表。查询将A的每一行与B的每一行进行比较,以找到满足连接谓词的所有行对。当满足连接谓词时,A和B的每对匹配行的列值将合并到结果行中。

http://en.wikipedia.org/wiki/Join_(SQL)#Inner_join

在您的情况下, join-predicate m.member_id = b.member_id

答案 3 :(得分:0)

- 大多数答案都没有解决您的关键问题 - 所有赌注都不仅仅是其中一个 - 你去吧

Select memberid 
  from members 
 where points = 0 
   and member id not in (select member id from bets where bet <> -1 )

随着数据量增长到非常高的数量,效率甚至更高

Select memberid 
  from members 
 where points = 0 
   and member id not in (select member id from bets where bet <> -1 and bets.memberid = members.memberid)

答案 4 :(得分:0)

试试这个

   SELECT m.member_id , b.finished FROM members m
   INNER JOIN bets b
   ON m.member_id = b.member_id
   WHERE m.points = 0
   and b.finished = 1

LOOK DEMO SQLFIDDLE