簡體   English   中英

MySql查詢,用於從對話和消息表聯接中選擇最新消息

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

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