Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySql查询,用于从对话和消息表join中选择最新消息_Php_Mysql_Sql - Fatal编程技术网

Php MySql查询,用于从对话和消息表join中选择最新消息

Php MySql查询,用于从对话和消息表join中选择最新消息,php,mysql,sql,Php,Mysql,Sql,请告诉我这段代码有什么问题,它返回所有对话,但只返回第一次对话的最新消息 SELECT conversations.*, messages.message, patients.first_name as fullname, patients.city, patients.thumb, patients.gender, patients.online_status FR

请告诉我这段代码有什么问题,它返回所有对话,但只返回第一次对话的最新消息

    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
    )
我不确定外部分组是否正确—它可能根本不需要,而且似乎与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
    )

除非列是字符串或日期,否则不要对常量使用单引号。

您希望对话的消息最大,而不是治疗师,因此我怀疑您希望在该子查询中使用以下内容:

    AND messages.message_id = 
    (
       SELECT MAX(message_id) 
       FROM messages z
       WHERE z.message_id = conversations.id
    )
    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
我不确定外部分组是否正确—它可能根本不需要,而且似乎与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 ) 发现了问题。就在这里: 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 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

你的问题是:

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

我通过这个查询解决了这个问题

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 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可用于按日期提供订单

注意不符合SQL的GROUP by。MySQL对于5.7+中的版本要严格得多。通常,任何非聚合字段都需要是组的一部分BY@apokryfos我已经删除了GROUP BY,但它仍然会收到第一行的消息,其他行不会收到最新消息。该评论不是针对此特定问题的。如果你想升级你的MySQL版本,这更像是一个警告。@apokryfos谢谢你的建议,请记住这一点。任何关于我上面写的查询的建议。小心不符合SQL的GROUP BY。MySQL对于5.7+中的版本要严格得多。通常,任何非聚合字段都需要是组的一部分BY@apokryfos我已经删除了GROUP BY,但它仍然会收到第一行的消息,其他行不会收到最新消息。该评论不是针对此特定问题的。如果你想升级你的MySQL版本,这更像是一个警告。@apokryfos谢谢你的建议,请记住这一点。关于我上面写的查询的任何建议。你是对的,不需要GROUP BY,但它仍然只获取第一行的最新消息。其他行没有messages表中的最新消息。您是对的,不需要GROUP BY,但它仍然只获取第一行的最新消息。其他行没有来自messages表的最新消息。