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

时间:2016-10-08 12:49:32

标签: php mysql join

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

我有一个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来留空。

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

我长期以来一直在打这个东西。有人能提供解决方案吗?

非常感谢!

1 个答案:

答案 0 :(得分:2)

问题不在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的布尔速记更方便,更易读。