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子句开始吐出相同值的项目。