2017-03-17 50 views
0

我有這些表:聊天在MySQL - 選擇 - GROUP BY

表名:USER_DATA

--------------------------- 
| id | owner | name | 
--------------------------- 
| 1 | 120 | "Nicolas" | 
| 2 | 140 | "Angel" | 
--------------------------- 

表名:private_messages

-------------------------------------------- 
| id | ownerID | toUserID | message  | 
-------------------------------------------- 
| 1 | 120 | 140 | "Hi"   | 
| 2 | 120 | 140 | "How are you?" | 
| 3 | 120 | 140 | "I miss u"  | 
| 4 | 140 | 120 | "Viewed."  | 
-------------------------------------------- 

,我需要選擇所有行聊天的用戶,例如,我有用戶ID「120」,我需要做一個查詢,返回所有通道在ownerID或toUserID中出現「120」的ats。

這是我的實際查詢:

SELECT 
user_data.owner, 
ANY_VALUE(user_data.name) name, 
ANY_VALUE(private_messages.message) message 
FROM private_messages 
INNER JOIN user_data ON private_messages.ownerID = user_data.owner 
WHERE private_messages.owner = "120" OR private_messages.toUserID = "120" 
GROUP BY user_data.owner 

結果這個疑問是:

---------------------------------------- 
| owner | name  | message  | 
---------------------------------------- 
| 120 | "Nicolas" |  "Hi"  | 
| 140 | "Angel" | "Viewed." | 
---------------------------------------- 

但如果你認爲這是錯誤的,因爲這兩個元素是來自同一個聊天。正確的結果應該是兩個用戶之間的最後一條消息:

---------------------------------------- 
| owner | name  | message  | 
---------------------------------------- 
| 140 | "Angel" | "Viewed." | 
---------------------------------------- 

有沒有辦法做到這一點?

+1

爲什麼你說需要所有的聊天,但隨後通過使用一組?然後你的預期結果是單排?請詳細解釋你的邏輯。 –

+0

這只是這個表中的唯一兩個用戶,還是會有其他用戶ID?也許多一些信息會有所幫助...... – Kevin

+0

爲什麼在'WHERE'子句中使用'OR',如果你需要消息屬於**兩個**用戶?你需要像private_messages.owner =「120」和private_messages.owner =「140」'。 – abcdn

回答

0
SELECT 
user_data.owner, 
ANY_VALUE(user_data.name) name, 
ANY_VALUE(private_messages.message) message 
FROM private_messages 
INNER JOIN user_data ON private_messages.owner = user_data.owner 
WHERE private_messages.touser = "120" 
GROUP BY user_data.owner 
+0

'120'可以是'touser'或'ownerid' –

+0

添加答案時,請確保包含您的解釋,而不僅僅是代碼片段。 –

0
SELECT private_messages.id, user_data.owner, 
ANY_VALUE(user_data.name) name, 
ANY_VALUE(private_messages.message) message 
FROM private_messages 
INNER JOIN user_data ON private_messages.ownerID = user_data.owner 
WHERE private_messages.owner = "120" OR private_messages.toUserID = "120" 
GROUP BY user_data.owner order by private_messages.id DESC LIMIT 1 

,你會得到一個額外的列。我希望你能夠過濾查詢來排除id行。

0

試試這個:

select u.owner, u.name, p.message 
from private_messages p 
left join user_data u 
    on p.ownerid = u.owner 
where p.id = (select MAX(id) id 
       from private_messages 
       where (ownerid = u.owner or touserId = u.owner) 
       and ownerid = 140) 
+0

Hi Rigerta,有一個問題,爲什麼在設置表名之前使用「#」? –

+0

嗨,很抱歉,那是因爲我創建了一個臨時表來重新創建情境。我會編輯答案。 –

+0

你會有什麼好處是有另一個表稱爲聊天,併爲每個private_messages記錄有一個chat_id。 當兩個用戶互相交換消息時,所有需要跟蹤的信息都是chat_id,無論何時您需要查找最新的聊天消息,您只需檢查private_messages中的max(id),其中chat_id將會是這兩個用戶在他們之間有一個。 –