mysql组和排序联合

mysql组和排序联合,mysql,Mysql,在我的留言簿中有两个表:消息和回复。 现在,我想让所有消息按id分组(意味着消息和相应的回复将被分组/在一起)并按date DESC排序(最新的消息将排在第一位;如果消息是最旧的消息,但相应的回复是所有消息中最新的,则该组将位于表的顶部),而回复将按日期ASC排序(最早的回复在顶部)。 这里我的mysql查询运行良好,只是它没有按日期ASC对回复进行排序 SELECT msg.id as id, msg.comment, msg.date_added as date_added, 0 as is

在我的留言簿中有两个表:
消息
回复
。 现在,我想让所有消息按id分组(意味着消息和相应的回复将被分组/在一起)并按date DESC排序(最新的消息将排在第一位;如果消息是最旧的消息,但相应的回复是所有消息中最新的,则该组将位于表的顶部),而回复将按日期ASC排序(最早的回复在顶部)。 这里我的mysql查询运行良好,只是它没有按日期ASC对回复进行排序

SELECT msg.id as id, msg.comment, msg.date_added as date_added, 0 as is_reply
  FROM messages AS msg 
UNION 
SELECT reply.msg_id as id, reply.comment, reply.date_added as date_added, 1 as is_reply
  FROM pg_reply as reply 

GROUP BY id 
ORDER BY date_added DESC, is_reply ASC 
回复ASC是否不像我想象的那样做

reply.msg_id
指定回复父项的id(
messages.id

结果应该是什么样子>

- message A
- oldest reply B 
- old reply C
- new reply Z  // this is the newest message in the guestbook 
- newer message E // is newer than A but older than the newest message in the guestbook, which is Z
- reply F // (this reply is newer than all messages but message Z)

我建议在这两个字段中都添加一个message parent字段,并将其排序为主要排序,然后将date作为之后的排序。。否则,您的回复将与在回复之间发布的其他邮件混合显示。您可以将非回复邮件的邮件父项设置为其自身。

对于此答案,我将假定reply.msg_id是原始邮件的链接字段

SELECT id, comment, date_added, is_reply FROM (
  SELECT 
    msg.id as id
    , msg.comment
    , msg.date_added as date_added
    , 0 as is_reply
    FROM messages AS msg 
UNION 
  SELECT 
    reply.msg_id as id
    , reply.comment
    , reply.date_added as date_added
    , 1 as is_reply
  FROM pg_reply as reply ) AS allmsg
ORDER BY id DESC, is_reply, date_added DESC
假设
msg_id
是一个自动递增字段,并且较新的id也添加了较新的
date_
时间戳

关于原始代码的备注
在您的原始代码中

GROUP BY id 
ORDER BY date_added DESC, is_reply ASC
groupby
id
ASC上隐式排序;以下
orderby
覆盖了第一个添加的
date.
是第二个回复。
但是,如果添加的
date\u
datetime
,则两篇文章拥有相同时间的可能性很小(特别是对于回复,写它们需要时间),
所以第二顺序从句很少被使用

只有在
选择中有聚合函数,例如
求和
计数

如果要从select中删除重复项,请不要使用分组方式,使用distinct as in
从表1中选择distinct a、b、c,其中…

尝试以下操作:

SELECT id, comment, date_added, is_reply
FROM (
    SELECT msg.id as id, msg.comment, msg.date_added as date_added, 0 as is_reply
      FROM messages AS msg 
    INNER JOIN pg_reply as reply
    ON reply.msg_id = msg.id
    GROUP BY msg.id, msg.comment, msg.date_added, 0 as is_reply
    ORDER BY CASE WHEN MAX(reply.date_added) > msg.date_added THEN MAX(reply.date_added) ELSE msg.date_added END DESC
    UNION 
    SELECT reply.msg_id as id, reply.comment, reply.date_added as date_added, 1 as is_reply
    FROM pg_reply as reply 
    ORDER BY date_added ASC ) a
ORDER BY id
类似的解决方案:

SELECT sort, project, reviewdate, reviewby, subject, venue, filename, remarks1, remarks2, url
FROM (

   SELECT '1' AS sort, project, last_updated AS reviewdate, reviewby, concat( project, '(', 
    TYPE , '): ', subject ) AS subject, venue, filename, remarks1, remarks2, concat( project, '/', 
    TYPE , '/', filename ) AS url
   FROM `upload_cmg` 
   WHERE (
     (
      subject LIKE '%prt%'
      OR project LIKE '%prt%'
      OR TYPE LIKE '%prt%'
     )
     AND (
      subject LIKE '%mouda%'
      OR project LIKE '%mouda%'
      OR TYPE LIKE '%mouda%'
     )
   )
   UNION SELECT '2' AS sort, project, last_updated AS reviewdate, reviewby, concat( project, '(', 
    TYPE , '): ', subject ) AS subject, venue, filename, remarks1, remarks2, concat( project, '/', 
    TYPE , '/', filename ) AS url
   FROM `upload_cmg` 
   WHERE subject LIKE '%mouda%'
   GROUP BY url
) AS vin
ORDER BY sort, reviewdate DESC 

回复如何与其父邮件关联?也就是说,您如何知道回复所回复的是什么消息?我没有看到任何包含此映射的字段。您使用哪个字段链接邮件及其回复?reply是否有origmsg_id字段?@squawknull@Johan噢,我忘了,reply.msg_id是reply的父项谢谢。我不知道order by子句只适用于具有相同值的项目,好消息是的,第二个order by子句只适用于第一个order by子句开始吐出相同值的项目。