[英]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.