繁体   English   中英

MySQL LEFT OUTER JOIN 没有给出正确的结果

[英]MySQL LEFT OUTER JOIN not giving correct results

这可能很简单,但我看不到问题...

我有一个 MySQL 表,其中包含按标题列出的邮件列表索引。 该表是 LISTS。 然后是一个用户表和一个订阅表。 订阅表包含将用户链接到他们的邮件列表的简单条目。

关注的列是:

USERS u_id
LISTS l_id
SUBS s_id, u_id, l_id

所以当用户 23 加入邮件列表 7 时,在 SUBS 中创建的条目是:

s_id: 1 --
u_id: 23 --
l_id: 7

问题是:当用户查看他们的订阅时,我需要显示一个显示所有邮件列表的表格,每个列表都有一个复选框,如果他们已经订阅了该列表,则勾选该复选框。

我的 SQL,这是错误的,但我不确定如何,在这里:

SELECT l.l_id, l.l_name, l.l_desc,
CASE
 WHEN s.u_id = '23' THEN 1 ELSE 0 
END
FROM lists as l
LEFT OUTER JOIN
subs as s
ON s.l_id = l.l_id 
GROUP BY l.l_id ASC

这应该显示 1 以勾选相关框,并显示 0 以将它们留空。

但是这种行为很奇怪,因为当我从 subs 中得到 * 时,我会看到所有预期的内容。 但是,上面的 SQL 会返回几个存在订阅的空复选框。 更奇怪的是,如果所有的框都被勾选了,SQL 根本不返回任何勾选。

我已经和这件事斗争了太久了。 有人可以提供解决方案吗?

非常感谢!

问题不在于LEFT JOIN ,而在于聚合。 您需要在SELECT聚合函数。

但是,我认为您根本不需要聚合。 假设一个用户ID只能出现一次lists了一个给定的名单:

SELECT l.l_id, l.l_name, l.l_desc,
       (s.l_id is not null) as flag
FROM lists l LEFT OUTER JOIN
     subs s
     ON s.l_id = l.l_id AND s.u_id = 23;

可以按照自己的方式表达查询(使用聚合)。 它看起来像:

SELECT l.l_id, l.l_name, l.l_desc,
       MAX(s.u_id = 23) as flag
FROM lists l LEFT OUTER JOIN
     subs s
     ON s.l_id = l.l_id 
GROUP BY l.l_id, l.l_name, l.l_desc;

您也可以使用MAX(CASE s.u_id = 23 THEN 1 ELSE 0 END) ,但 MySQL 的布尔简写更方便和可读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM