SQL查询优化,如果第一个为空,则按其他行排序

时间:2015-02-02 15:47:47

标签: mysql sql select left-join

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

问题:

  1. 我需要加倍左连接才能从UUID获取用户提示主题并发布
  2. 并非所有主题都会发布,因为您看到我从帖子ID(它将是日期)排序,但它显示在最后一个帖子的第一个位置主题,并且在没有回复的底部主题上,我如何定义帖子不在时的顺序#39; t存在吗?

2 个答案:

答案 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按顺序编写关于该主题的帖子。任何没有帖子的主题都会在正确的标题顺序中有一行(假设只有一个主题作者),但只显示主题数据。

所以这一切都取决于你想看到的东西。