SQL查询:
SELECT
T.*,
U.nick AS author_nick,
P.id AS post_id,
P.name AS post_name,
P.author AS post_author_id,
U2.nick AS post_author
FROM
zero_topics T
LEFT JOIN
zero_posts P
ON
T.id = P.topic_id
LEFT JOIN
zero_players U
ON
T.author = U.uuid
LEFT JOIN
zero_players U2
ON
P.author = U2.uuid
ORDER BY
P.id DESC
问题:
答案 0 :(得分:0)
1.如果你需要在不同的列中显示缺刻,你需要加倍左连接
2.您可以在case
order by
ORDER BY
CASE
WHEN P.id is null THEN T.ID
ELSE P.ID
END ASC
最终查询: -
SELECT
T.*,
U.nick AS author_nick,
P.id AS post_id,
P.name AS post_name,
P.author AS post_author_id,
U2.nick AS post_author
FROM
zero_topics T
LEFT JOIN
zero_posts P
ON
T.id = P.topic_id
LEFT JOIN
zero_players U
ON
T.author = U.uuid
LEFT JOIN
zero_players U2
ON
P.author = U2.uuid
ORDER BY
CASE
WHEN P.id is null THEN T.ID
ELSE P.ID
END ASC
答案 1 :(得分:0)
您实际上有几个来自主题表的连接链。一条链将作者直接与主题联系起来,一条链接作者关于该主题的每个帖子,其中一个或两个可以保持联系。但是一旦你在一个链中开始一个左连接,它必须继续沿链的其余部分继续,或者你使左连接无效。实际上,主题作者的长度为1,所以你不必担心那个。
如果每个主题都有作者,则您不需要加入第一个玩家表(T.author = U.uuid),因为它总是会链接。即使他们没有写任何帖子,你也可以离开帖子链看看主题。
假设这是您想要查看的内容,那么order by
子句可能就像您编写它一样。你会得到的是一个按ID排序的帖子列表,其中散布的主题却是最终的。根据您的设置和DBMS,任何没有帖子的主题都会在结果集的开头或结尾聚集在一起。
但是,如果你像这样写了order by
:
order by t.Title, p.id;
然后,您将获得按标题排序的所有主题,并在每个主题中按ID按顺序编写关于该主题的帖子。任何没有帖子的主题都会在正确的标题顺序中有一行(假设只有一个主题作者),但只显示主题数据。
所以这一切都取决于你想看到的东西。