当数据不存在时,嵌套另一个表的select MAX()

时间:2019-07-30 14:24:33

标签: mysql

我有三个表:帖子,社区和社区主持人。我创建了一个SQL查询来显示用户管理的社区,包括创建日期和更新日期。更新日期是根据该社区中帖子的最大创建日期来计算的。

以下是适用于有帖子的社区的代码:

SELECT c.id, c.title, c.created, p.created as 'postdate'
FROM Post p, Community c, CommunityMod cm
WHERE p.created in
    (
        SELECT MAX(created)
        FROM Post
        GROUP BY community
    )
AND cm.moderator=$id AND p.community=c.id AND cm.community=c.id
ORDER by c.created DESC

问题在于该查询不会选择没有帖子的社区,因为p.community中没有数据。

我希望它也显示没有任何帖子的社区,但是它不会显示第p。条以显示更新的信息,而是显示任何内容或显示社区的创建日期(c.created)。 我该怎么办?

1 个答案:

答案 0 :(得分:0)

您需要为Post表使用LEFT JOIN。请注意,Post表中列的所有条件都应放在ON子句中。

SELECT ...
FROM Community c
JOIN CommunityMod cm ON cm.community = c.id
LEFT JOIN Post p
  ON  p.community = c.id
  AND p.created in
    (
        SELECT MAX(created)
        FROM Post
        GROUP BY community
    )
WHERE cm.moderator = $id
ORDER by c.created DESC

请注意,子查询可能无法正常工作,ff Post.created不是唯一的。您应该将其更改为相关的子查询:

SELECT ...
FROM Community c
JOIN CommunityMod cm ON cm.community = c.id
LEFT JOIN Post p
  ON  p.community = c.id
  AND p.created in
    (
        SELECT MAX(p1.created)
        FROM Post p1
        WHERE p1.community = c.id
    )
WHERE cm.moderator = $id
ORDER by c.created DESC

但是-如果您只需要created表中的Post值,则根本不需要子查询。

SELECT c.id, c.title, c.created, MAX(p.created) as 'postdate'
FROM Community c
JOIN CommunityMod cm ON cm.community = c.id
LEFT JOIN Post p ON p.community = c.id
WHERE cm.moderator = $id
GROUP BY c.id
ORDER by c.created DESC