[英]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_id
, to_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.