使用子查询在mysql中按多列排序

时间:2010-04-21 02:30:15

标签: mysql

嘿伙计我有一个查询选择数据和组织但不是正确的顺序。我想要做的是在该周选择用户的所有注释并按每个主题对其进行排序,然后按照各自群集中每个注释的最新时间戳对群集进行排序。我当前的查询选择了正确的数据,但看似随机顺序。有没有人有任何想法?

    select * from (
      SELECT
        topic.topic_title, topic.topic_id
      FROM comments
      JOIN topic ON topic.topic_id=comments.topic_id
      WHERE comments.user='$user' AND comments.timestamp>$week order by comments.timestamp desc) derived_table
group by topic_id

4 个答案:

答案 0 :(得分:4)

最终版本,我希望:

SELECT topic_title, topic_id
      FROM comments
      JOIN topic ON topic.topic_id = comments.topic_id
      WHERE comments.user = '$user' AND comments.timestamp > $week
      GROUP BY topic_id ORDER BY MAX(timestamp) DESC

MAX(时间戳)将分别应用于每个分组(请参阅http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html)。

答案 1 :(得分:1)

按topic.tropic_title,comments.timestamp

排序

答案 2 :(得分:0)

除了其他评论之外,您还需要将ORDER BY topic.topic_title移出子查询。

答案 3 :(得分:0)

我可能错了,但我不认为您的查询会返回主题的所有评论。由于您按topic_id进行分组,因此会按主题对其进行分组,并且每个主题只返回一行和注释。如果您希望按主题和时间戳排序的每个主题的所有注释,则可以使用此查询。

SELECT topic.topic_title,topic.topic_id,comments.*
  FROM comments
  JOIN topic ON topic.topic_id=comments.topic_id
  WHERE comments.user='$user' 
  AND comments.timestamp>$week 
ORDER by topic.topic_title,comments.timestamp desc

如果您要执行的操作是按主题分组并返回每个主题的最新注释,则可以使用以下查询。查询获取每个主题的最新注释,并为每个主题抓取与最新时间戳匹配的整个注释行。

SELECT latest_ts.topic_title,latest_ts.topic_id,comments.*
  FROM comments
  JOIN (SELECT topic.topic_title,topic.topic_id,max(comments.timestamp) latest_timestamp
     FROM comments
     JOIN topic ON topic.topic_id=comments.topic_id
     WHERE comments.user=$user 
     AND comments.timestamp>$week
     GROUP BY topic.topic_title,topic.topic_title) latest_ts
  ON latest_ts.latest_timestamp = comments.timestamp
  AND latest_ts.topic_id = comments.topic_id
ORDER by latest_ts.topic_title

如果给定主题的最后两个注释具有相同的时间戳,则上面的查询可能会返回每个主题两行。如果这是一个问题,你需要做一些额外的工作,将这个输出包装在另一轮分组中,以丢失不需要的行。