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表的最新消息。