我想获取所有用户的列表,并标记某个行值为16时也出现在另一个名为memo的表中的用户(基于其唯一标识符)。mp表的每一行都有一个工作程序和一个备忘录。工人是唯一的用户ID。因此,如果u.keyid = mp.worker且mp.memo = 16,则用户在备忘录中(例如16)。这是我编写的查询。
SELECT DISTINCT
u.name AS name,
IF ((mp.worker = u.keyid AND mp.memo = 16),1,0) AS isin
FROM users AS u, mp;
因此,如果表mp中有一个条目,使得备忘录16的mp.worker = u.keyid,isin应该为1。
但是,此查询为我提供了一个完整的用户列表,其中包含所有0,以及备忘录中所有用户(再次)均为1。因此,可以说用户是John,Michael,Sarah和Jane。说只有约翰和简参加会议,我会得到以下结果:
John 0
Micahel 0
Sarah 0
Jane 0
John 1
Jane 1
但是我想要的是:
John 1
Micahel 0
Sarah 0
Jane 1
我应该怎么写才能得到我想要的?
您的查询正在做CROSS JOIN
(笛卡尔积)。
您只需要一个EXISTS
子句(这也可以用来完成left join
,但我认为EXISTS
更清楚)
SELECT u.Name
CASE WHEN EXISTS (Select null from mp
where mp.worker = u.keyid
and mp.memo = 16)
THEN 1 else 0 END
AS isin
FROM users u
您当然可以使用IF
子句代替CASE... WHEN
(这是ANSI,而IF
不是)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句