簡體   English   中英

MySQL查詢與UNION和SORT

[英]MySql Query with UNION and SORT

實際上,我正在嘗試創建一個類似於FB(Messages)的對話界面,為此,使用一個SQL查詢來獲取所有已經與用戶交談過的人。 我需要按降序與之交談的用戶的ID,例如如果A已與B和C聊天。那么B AND C將是該查詢的結果,而B將首先出現是因為A最近與B聊天。

我的“郵件”表結構為: http : //www.softnuke.com/me/files/DB.png

這是FB示例: http : //www.softnuke.com/me/files/msg.png

這是我不正確的查詢,需要解決:

SELECT DISTINCT(`mates`)FROM(
    SELECT `time` AS `time`,`from_id` AS `mates` 
     FROM `messages` AS T WHERE (`from_id`=$uid OR `to_id`=$uid) 

    UNION

    SELECT `time` AS `time`,`to_id` AS `mates`
    FROM `messages` AS T WHERE (`from_id`=$uid OR `to_id`=$uid) 

    ) AS T 
    WHERE `mates`!='$uid'
    ORDER BY `time`

$ uid將給我要獲取列表的用戶的變量(此處為A)。

您似乎正在成為主要人物以及他們正在與之交談的人,而不論哪個人是主要人物。 同樣也不十分清楚,當您使用DISTINCT時,MySQL將如何計算出時間來排序商品,這會隨着時間刪除某些記錄。

您可以通過以下方式獲得最長時間和訂單:-

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM