Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用UNION和SORT的MySql查询_Mysql_Sql_Join_Union - Fatal编程技术网

使用UNION和SORT的MySql查询

使用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时

实际上,我正在尝试创建一个像FB(Messages)这样的对话界面,并为此使用一个sql查询来获取所有已经与用户交谈过的人。 我需要按降序排列与他通话的用户的id, 例如,如果A与B和C聊天,那么B和C将是该查询的结果,B将首先出现,因为A最近与B聊天

我的“消息”表结构是:

这是一个例子:

这是我的错误查询,需要修复:
$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