簡體   English   中英

重新發布:查詢消息列表

[英]Repost : Query messages theard list

好吧,我再次發布了相同的問題,但是這次使用了可能可行的替代解決方案。

我有帶有以下字段的消息表。

1)id(pk),from_id(fk),to_id(fk),輸入日期,消息

我的要求如下。

我需要向登錄用戶顯示與其他用戶的最新消息。 例如

“ mahendra”是一個登錄用戶,與“ john”通訊的用戶說5條消息,而與“ smith”通訊的3條消息。

在這5和3條消息中,登錄用戶(mahendra)可以是發件人(from_id)或收件人(to_id)

我需要顯示每個用戶與登錄用戶的最新通信。 像這樣的東西

1)mahendra-john-這是mahendra和john之間的最后一條消息2)mahendra-smith-這是mahendra和smith之間的最后一條消息

在我的上一篇文章中,我無法獲得查詢來實現此目的。 這就是我所做的。

$result=mysql_query("SELECT * FROM messages WHERE from_id=$_SESSION['userid'] OR to_id=$_SESSION['userid'] ORDER BY date_entered DESC");

現在,我有了所有登錄用戶為發送者或接收者的記錄。

現在,我需要過濾其他用戶(約翰和史密斯)和mahendra中的最后一條消息,並將其放入其他數組中;

知道怎么做嗎?

SELECT  b.Name Fromname,
        c.name ToName,
        a.date_entered,
        a.Message
FROM
        (
            SELECT  *
            FROM    Messages
            where   (LEAST(from_id, to_id), GREATEST(from_id, to_id), date_entered) IN
                    (
                        SELECT  LEAST(from_id, to_id) as fromID, 
                                GREATEST(from_id, to_id) as toID, 
                                MAX(date_entered) as date_entered
                        FROM    Messages 
                        GROUP   BY fromID, toID
                    )
        ) a
        INNER JOIN UserList b
            ON a.from_id = b.ID 
        INNER JOIN UserList c
            ON a.to_ID = c.ID
WHERE   'Mahendra' IN (b.name, c.Name)

簡要說明

讓我們分解整個查詢。 查詢的核心是

SELECT  *
FROM    Messages
where   (LEAST(from_id, to_id), GREATEST(from_id, to_id), date_entered) IN
        (
            SELECT  LEAST(from_id, to_id) as fromID, 
                    GREATEST(from_id, to_id) as toID, 
                    MAX(date_entered) as date_entered
            FROM    Messages 
            GROUP   BY fromID, toID
        )

查詢的作用是借助MySQL中的LEAST()GREATEST()函數,從Messages表中獲取每個用戶的最新對話。 兩次在表UserList包含用戶名列表的表)上加入子查詢的原因是因為有兩列: from_idto_id依賴於此表。

也許您想檢查一下,在SQL Fiddle中回答

這是我的查詢:

SET @user_id = 1;

SELECT COUNT(M.Id) AS MessageCount 
    , IF(M.from_id = @user_id, M.to_id, M.from_id) AS CommunicatedWith
    , (SELECT message FROM messages WHERE id = MAX(M.id)) AS LastMessage
    FROM messages AS M
    WHERE M.from_id = @user_id OR M.to_id = @user_id
    GROUP BY CommunicatedWith;

這只是查詢版本,如果您使用的是stored procedure ,建議您@user_id變量@user_id替換為本地變量。

暫無
暫無

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

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