我有三个表:帖子,社区和社区主持人。我创建了一个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)。 我该怎么办?
答案 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