簡體   English   中英

從PHP中的mysql獲取兩個字段之間的唯一記錄

[英]get unique records between two fields from mysql in php

我有一個表,用於存儲我與朋友一起完成的私人消息。 在此處輸入圖片說明

我具有如圖所示的表結構。假設我登錄的user_id為1,現在我想顯示他的最后五個唯一對話以及每個對話的最后一條消息。

不是很優雅,但是可以工作:

SELECT m1.*
    FROM private_msgs m1 LEFT OUTER JOIN private_msgs m2 
    ON (m1.message_from_uid=m2.message_from_uid AND m1.message_to_uid=m2.message_to_uid AND m1.message_time<m2.message_time)
WHERE m2.message_id IS NULL AND m1.message_from_uid=$uid
ORDER BY message_time DESC;

將限制增加到5或任何您想要的

編輯。 抱歉,我沒有注意到UID可以作為發送者或接收者。 您是否可以在此處發布帶有示例數據的表,例如: http : //sqlfiddle.com

無論如何,應該達到這個目的:

WHERE m2.message_id IS NULL AND (m1.message_from_uid=$uid OR m1.message_to_uid=$uid)

在這里,又長又丑。 您可以在一個大型最終查詢中將臨時表替換為子查詢。 解釋在最后。

CREATE TEMPORARY TABLE IF NOT EXISTS t1 AS
    (SELECT message_id, message_from_uid, message_to_uid, message_time
    FROM private_msgs
    WHERE message_from_uid=$UID)
 UNION 
    (SELECT message_id, message_to_uid, message_from_uid, message_time
    FROM private_msgs
    WHERE message_to_uid=$UID);

CREATE TEMPORARY TABLE IF NOT EXISTS t2 AS SELECT * FROM t1;

SELECT m.*
    FROM (t1 LEFT OUTER JOIN t2 
    ON (t1.message_from_uid=t2.message_from_uid AND t1.message_to_uid=t2.message_to_uid AND t1.message_time<t2.message_time)) 
JOIN private_msgs m ON t1.message_id=m.message_id
WHERE t2.message_id IS NULL AND t1.message_from_uid=$UID
ORDER BY t1.message_time DESC;

DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;

t1臨時表接收$ UID是發送者的所有消息,並將它們與$ UID是接收者的消息進行合並,但是將$ UID用作發送者。 在t1中,誰是發送者/接收者都沒有關系。 重要的是這些是$ UID與其他人之間的對話。

t2是t1的副本,因為在MySQL中您無法將臨時表與其自身連接。

最后,我們進行查詢。 我們加入t1和t2,在每次對話中僅接收最新消息,並將消息從最新到最舊進行排序。 就像在t1和t2中將發送者和接收者混合在一起一樣,我們使用private_msg進行最后的連接以獲得原始數據。

PS。 對不起,我的英語不是母語。

在我的舊代碼中發現:

    select m.*
        from private_messages m
        join user_table s ON m.sender_id = s.id
        join user_table r ON m.receiver_id = r.id
        join (select if(sender_id = $UID, receiver_id, sender_id) as user_id_other,
            max(posted_at) AS date_time_max from private_messages
                where (sender_id = $UID OR receiver_id = $UID)
                group by if(sender_id=$UID, receiver_id, sender_id)
                ) AS t
        on if(m.sender_id = $UID, m.receiver_id, m.sender_id) = user_id_other 
        AND m.posted_at=date_time_max
    where m.sender_id = $UID OR m.receiver_id = $UID
    order by m.posted_at desc

對結果不承擔任何責任,但這可以有所幫助。 如您所見,變量本身必須被替換,我並沒有對代碼進行太多修改。 但是這段代碼...起作用了。

在您的情況下,例如:

select m.*
    from YOUR_MESSAGES_TABLE m
    --- OPTIONAL: join YOUR_USER_TABLE s ON m.message_from_uid = s.id
    --- OPTIONAL: join YOUR_USER_TABLE r ON m.message_to_uid = r.id
    join (select if(message_from_uid = $YOUR_USER_ID, message_to_uid, message_from_uid) as user_id_other,
        max(message_time) AS date_time_max from YOUR_MESSAGES_TABLE
            where (message_from_uid = $YOUR_USER_ID OR message_to_uid = $YOUR_USER_ID)
            group by if(message_from_uid=$YOUR_USER_ID, message_to_uid, message_from_uid)
            ) AS t
    on if(m.message_from_uid = $UID, m.message_to_uid, m.message_from_uid) = user_id_other 
AND m.message_time=date_time_max
where m.message_from_uid = $UID OR m.message_to_uid = $UID
order by m.message_time desc limit 5

測試: http//sqlfiddle.com/#!9 / f66fd8 / 4

暫無
暫無

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

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