【问题标题】:How to use ORDER BY in a query which is containing JOIN?如何在包含 JOIN 的查询中使用 ORDER BY?
【发布时间】:2015-12-18 00:33:30
【问题描述】:

我有一个查询,它为每个帖子选择所有 cmets。这是我的查询:

SELECT c.id, c.content, u.name, u.reputation, SUM(v.value) AS total_vote_comments
FROM comments c
INNER JOIN users u ON c.user_id = u.id
LEFT JOIN votes_comments v ON c.id = v.comment_id
WHERE c.post_id = :id;

现在我想将ORDER BY c.id 添加到该查询中。怎么样?

【问题讨论】:

    标签: mysql join sql-order-by


    【解决方案1】:

    order by 无关紧要,因为此查询返回一行:

    SELECT c.id, c.content, u.name, u.reputation, SUM(v.value) AS total_vote_comments
    FROM comments c INNER JOIN
         users u
         ON c.user_id = u.id LEFT JOIN
         votes_comments v
         ON c.id = v.comment_id
    WHERE c.post_id = :id;
    

    这是一个没有GROUP BY 的聚合查询(因为SUM())。这样的查询总是返回一行,即使没有行匹配连接。

    您可能想要GROUP BY。我的最佳猜测是:

    SELECT c.id, c.content, u.name, u.reputation, SUM(v.value) AS total_vote_comments
    FROM comments c INNER JOIN
         users u
         ON c.user_id = u.id LEFT JOIN
         votes_comments v
         ON c.id = v.comment_id
    WHERE c.post_id = :id
    GROUP BY c.id, c.content, u.name, u.reputation
    ORDER BY c.id;
    

    【讨论】:

    • 看我......你在 MySQL 中真的很擅长(或者可能在所有数据库中),感谢你的回答。
    • 只有一个问题。如果我在SELECT 子句CONCAT(SUBSTR(col, 1, 9), IF(LENGTH(subject_f) > 9,' ...','')) newcol 中有这个,那么我也必须在GROUP BY 中添加newcol
    • @stack 。 . .我认为你应该这样做。
    【解决方案2】:

    您可以在末尾添加ORDER BY 子句:

    SELECT c.id, c.content, u.name, u.reputation, SUM(v.value) AS total_vote_comments
    FROM comments c
    INNER JOIN users u ON c.user_id = u.id
    LEFT JOIN votes_comments v ON c.id = v.comment_id
    WHERE c.post_id = :id
    ORDER BY c.id;
    

    【讨论】:

    • 好的,谢谢,只有一件事,我应该在那个查询中使用GROUP BY 吗? (因为SELECT语句中有SUM()
    • 在 MySQL 中,您不必在使用聚合函数时指定 GROUP BY 子句,尽管这样做是一种好习惯。所以是的,你应该在c.id, c.content, u.name, u.reputation 上添加一个GROUP BY 子句
    • 我明白了。再次感谢。 +1
    • 我同意 Jaco 的观点。你可以在 MySQL 中不使用 GROUP BY,但在很多数据库上你不能——你会得到一个语法错误。在这种性质的查询中不使用 group by 并没有太多逻辑用途。
    【解决方案3】:

    通过使用此查询,您只会得到一行 id 放在 where 子句中的行。 如果您想订购一篇文章,那么您在最后写下 order by。 如果您想先获得最后的评论,请使用 desc 和 order by。

    SELECT c.id, c.content, u.name, u.reputation, SUM(v.value) AS total_vote_commentFROM cmets c INNER JOIN users u ON c.user_id = u.id LEFT JOIN votes_cmets v ON c.id = v.comment_id WHERE c.post_id = :id order by id desc;

    desc = 降序
    asc = 升序

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 2013-02-09
      • 2017-03-30
      • 2018-02-14
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多