0

我有一个表成员

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 的一行。

4

5 回答 5

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
于 2013-01-16T22:24:40.043 回答
0

使用 a 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;
于 2013-01-16T22:19:37.220 回答
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

在您的情况下,连接谓词m.member_id = b.member_id.

于 2013-01-16T22:19:53.960 回答
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)
于 2013-01-16T22:20:19.670 回答
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

看演示 SQLFIDDLE

于 2013-01-16T22:20:40.340 回答