使用UNION和SORT的MySql查询
实际上,我正在尝试创建一个像FB(Messages)这样的对话界面,并为此使用一个sql查询来获取所有已经与用户交谈过的人。 我需要按降序排列与他通话的用户的id, 例如,如果A与B和C聊天,那么B和C将是该查询的结果,B将首先出现,因为A最近与B聊天 我的“消息”表结构是: 这是一个例子: 这是我的错误查询,需要修复:使用UNION和SORT的MySql查询,mysql,sql,join,union,Mysql,Sql,Join,Union,实际上,我正在尝试创建一个像FB(Messages)这样的对话界面,并为此使用一个sql查询来获取所有已经与用户交谈过的人。 我需要按降序排列与他通话的用户的id, 例如,如果A与B和C聊天,那么B和C将是该查询的结果,B将首先出现,因为A最近与B聊天 我的“消息”表结构是: 这是一个例子: 这是我的错误查询,需要修复: $uid将为我提供要获取列表的用户的变量(这里是A)。您似乎得到了主要用户和他们交谈的对象,而不管哪一个是主要用户。也不太确定MySQL将如何计算出您使用DISTINCT时
$uid将为我提供要获取列表的用户的变量(这里是A)。您似乎得到了主要用户和他们交谈的对象,而不管哪一个是主要用户。也不太确定MySQL将如何计算出您使用DISTINCT时的排序时间,DISTINCT将删除一些记录及其时间 您可以通过以下方式获得最长时间和订单:-
SELECT `mates`, MAX(`time`) AS LatestConv
FROM(
SELECT `time` AS `time`,`from_id` AS `mates`
FROM `messages` AS T WHERE `to_id`=$uid
UNION
SELECT `time` AS `time`,`to_id` AS `mates`
FROM `messages` AS T WHERE `from_id`=$uid
) AS T
GROUP BY `mates`
ORDER BY LatestConv
要获取最新消息的状态,请执行以下操作:-
SELECT a.mates, a.LatestConv, IFNULL(b.Status, c.Status)
FROM
(
SELECT mates, MAX(`time`) AS LatestConv
FROM(
SELECT `time` AS `time`, from_id AS mates
FROM messages AS T
WHERE to_id = $uid
UNION
SELECT `time` AS `time`, to_id AS mates
FROM messages AS T
WHERE from_id = $uid
) AS T
GROUP BY `mates`
) a
LEFT OUTER JOIN messages b
ON a.mates = b.from_id AND a.LatestConv = b.`time` AND b.to_id = $uid
LEFT OUTER JOIN messages c
ON a.mates = c.to_id AND a.LatestConv = c.`time` AND c.from_id = $uid
ORDER BY LatestConv
请注意,如果给同一个人的多条消息都共享同一个最新时间,这可能会有点混淆。如果有可能,可按如下方式处理:-
SELECT a.mates, a.LatestConv, MAX(IFNULL(b.Status, c.Status))
FROM
(
SELECT mates, MAX(`time`) AS LatestConv
FROM(
SELECT `time` AS `time`, from_id AS mates
FROM messages AS T
WHERE to_id = $uid
UNION
SELECT `time` AS `time`, to_id AS mates
FROM messages AS T
WHERE from_id = $uid
) AS T
GROUP BY `mates`
) a
LEFT OUTER JOIN messages b
ON a.mates = b.from_id AND a.LatestConv = b.`time` AND b.to_id = $uid
LEFT OUTER JOIN messages c
ON a.mates = c.to_id AND a.LatestConv = c.`time` AND c.from_id = $uid
GROUP BY a.mates, a.LatestConv
ORDER BY LatestConv
那么什么不起作用呢?它不会以排序的方式给出结果,我的意思是B应该排在第一位,然后是C。拥有最新消息的用户将在结果的顶部出现,然后是第二位最新消息所有者,依此类推。老兄,你是摇滚明星!谢谢。是否也可以在结果中列出
状态
?(读/未读最新消息)这是可能的,但要复杂一点。我们将有一个快速播放
SELECT a.mates, a.LatestConv, MAX(IFNULL(b.Status, c.Status))
FROM
(
SELECT mates, MAX(`time`) AS LatestConv
FROM(
SELECT `time` AS `time`, from_id AS mates
FROM messages AS T
WHERE to_id = $uid
UNION
SELECT `time` AS `time`, to_id AS mates
FROM messages AS T
WHERE from_id = $uid
) AS T
GROUP BY `mates`
) a
LEFT OUTER JOIN messages b
ON a.mates = b.from_id AND a.LatestConv = b.`time` AND b.to_id = $uid
LEFT OUTER JOIN messages c
ON a.mates = c.to_id AND a.LatestConv = c.`time` AND c.from_id = $uid
GROUP BY a.mates, a.LatestConv
ORDER BY LatestConv