[英]MySQL - Conversation History overview - Selecting multiple latest items from table
[英]MySql query for selecting latest message from the conversation and messages table join
請告訴我這段代碼有什么問題,它返回所有對話,但僅返回第一次對話的最新消息。
SELECT
conversations.*,
messages.message,
patients.first_name as fullname,
patients.city,
patients.thumb,
patients.gender,
patients.online_status
FROM
patients
INNER JOIN conversations
ON conversations.patient_id_fk = patients.id
LEFT JOIN messages
ON messages.conversation_id = conversations.id
AND messages.message_id =
(
SELECT MAX(message_id)
FROM messages z
WHERE z.therapist_id_fk = conversations.therapist_id_fk
)
WHERE conversations.therapist_id_fk='1'
GROUP BY conversations.id
ORDER BY messages.message_id DESC
您想要對話的最大信息而不是治療師 ,所以我懷疑您希望在此子查詢中這樣做:
AND messages.message_id =
(
SELECT MAX(message_id)
FROM messages z
WHERE z.message_id = conversations.id
)
我不確定外部的GROUP BY
是否正確(可能根本不需要它,並且似乎與SELECT
的列沖突),但是如果沒有示例數據和所需的結果,這很難分辨。
編輯:
我知道,問題在於外部查詢中對治療師ID的過濾。 這使它變得更加復雜:
AND messages.message_id =
(
SELECT MAX(message_id)
FROM messages z JOIN
conversations c
ON m.conversation_id = c.id
WHERE c.therapist_id_fk = 1 AND -- restriction on subquery
z.message_id = conversations.id -- correlation to outer query
)
除非列是字符串或日期,否則不要對常量使用單引號。
SELECT
conversations.*,
messages.message,
patients.first_name as fullname,
patients.city,
patients.thumb,
patients.gender,
patients.online_status
FROM
patients
INNER JOIN conversations
ON conversations.patient_id_fk = patients.id
LEFT JOIN messages
ON messages.conversation_id = conversations.id
AND messages.message_id =
(
SELECT MAX(message_id)
FROM messages z
WHERE z.conversation_id = conversations.id
)
WHERE conversations.therapist_id_fk='1'
ORDER BY messages.message_id DESC
找到了問題。 在這里:
AND messages.message_id = ( SELECT MAX(message_id) FROM messages z WHERE z.conversation_id = conversations.id )
我正在使用這個:
AND messages.message_id = ( SELECT MAX(message_id) FROM messages z WHERE z.therapist_id_fk = conversations.therapist_id_fk )
我可以通過此查詢解決問題
SELECT conversations.*,m.message FROM `conversations` LEFT JOIN messages as m on conversations.id = m.conversation_id AND m.id = (SELECT MAX(ms.id) from messages as ms where ms.conversation_id = conversations.id)
我離開了郵件,這樣做時,我選擇了最上面的郵件。 Order by可用於按日期給出訂單
您的問題是:
SELECT MAX(message_id)
FROM messages z
WHERE z.therapist_id_fk = conversations.therapist_id_fk
此查詢僅匹配一條消息。 您需要一些不同的東西。 嘗試這個:
SELECT
conversations.*,
messages.message,
patients.first_name as fullname,
patients.city,
patients.thumb,
patients.gender,
patients.online_status
FROM
patients
INNER JOIN conversations
ON conversations.patient_id_fk = patients.id
LEFT JOIN messages
ON messages.conversation_id = conversations.id
WHERE conversations.therapist_id_fk='1'
AND messages.message_id IN ( -- new bit
SELECT MAX(message_id) FROM messages z GROUP BY z.conversation_id
)
GROUP BY conversations.id
ORDER BY messages.message_id DESC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.