MySql:使用GROUP BY和MAX选择最后插入的值

MySql:使用GROUP BY和MAX选择最后插入的值,mysql,Mysql,我有一个名为message的表,有5列。主键是自动递增的消息_id 我试图使用Group by和Max选择并显示最后插入的消息,该消息的相关消息id为26。因此,我想从表中选择所有内容,仅选择最后插入的消息,即“stackoverflow”。 我试着用各种方法,但都没有用 SELECT * FROM message WHERE person_send_id = :person_send_id OR person_receive_id = :person_receive_id

我有一个名为message的表,有5列。主键是自动递增的消息_id

我试图使用Group by和Max选择并显示最后插入的消息,该消息的相关消息id为26。
因此,我想从表中选择所有内容,仅选择最后插入的消息,即“stackoverflow”。

我试着用各种方法,但都没有用

SELECT *
   FROM message
   WHERE person_send_id = :person_send_id OR person_receive_id = :person_receive_id 
   AND related_message IN (SELECT MAX(related_message) FROM message GROUP BY related_message DESC)
   ORDER BY message_id DESC
方法2

SELECT message_id, message, person_send_id, person_receive_id, max(related_message) as `related_message`
   FROM message
   WHERE person_send_id = :person_send_id OR person_receive_id = :person_receive_id
   GROUP BY related_message DESC
   ORDER BY message_id DESC

借助DarbyM解决方案
我相信这就是你想要的:

SELECT m1.*
FROM message m1
JOIN (SELECT MAX(message_id) AS messageID 
        FROM messages
        Group By related_message) max
    ON max.messageID = m1.message_id
WHERE person_send_id IN (:person_send_id, :person_receive_id )

我相信这就是你想要的:

SELECT m1.*
FROM message m1
JOIN (SELECT MAX(message_id) AS messageID 
        FROM messages
        Group By related_message) max
    ON max.messageID = m1.message_id
WHERE person_send_id IN (:person_send_id, :person_receive_id )
第一项建议:

SELECT * FROM message INNER JOIN 
    (SELECT MAX(message_id) AS max_msg_id FROM message WHERE person_send_id = :person_send_id OR person_receive_id = :person_receive_id)
AS aux_table ON aux_table.max_msg_id = message.message_id
SELECT * FROM message INNER JOIN 
    (SELECT MAX(message_id) AS max_msg_id FROM message WHERE related_msg =: related_msg)
AS aux_table ON aux_table.max_msg_id = message.message_id
第二项建议:

SELECT * FROM message INNER JOIN 
    (SELECT MAX(message_id) AS max_msg_id FROM message WHERE person_send_id = :person_send_id OR person_receive_id = :person_receive_id)
AS aux_table ON aux_table.max_msg_id = message.message_id
SELECT * FROM message INNER JOIN 
    (SELECT MAX(message_id) AS max_msg_id FROM message WHERE related_msg =: related_msg)
AS aux_table ON aux_table.max_msg_id = message.message_id
第一项建议:

SELECT * FROM message INNER JOIN 
    (SELECT MAX(message_id) AS max_msg_id FROM message WHERE person_send_id = :person_send_id OR person_receive_id = :person_receive_id)
AS aux_table ON aux_table.max_msg_id = message.message_id
SELECT * FROM message INNER JOIN 
    (SELECT MAX(message_id) AS max_msg_id FROM message WHERE related_msg =: related_msg)
AS aux_table ON aux_table.max_msg_id = message.message_id
第二项建议:

SELECT * FROM message INNER JOIN 
    (SELECT MAX(message_id) AS max_msg_id FROM message WHERE person_send_id = :person_send_id OR person_receive_id = :person_receive_id)
AS aux_table ON aux_table.max_msg_id = message.message_id
SELECT * FROM message INNER JOIN 
    (SELECT MAX(message_id) AS max_msg_id FROM message WHERE related_msg =: related_msg)
AS aux_table ON aux_table.max_msg_id = message.message_id


你说m1是什么意思?我不太确定你对Where部分的确切需求。。我从您发布的失败尝试中推断出了我的示例。m1是我为“message”表指定的别名。(来自消息m1)它工作正常谢谢!我知道我有点过火了,但你能解释一下为什么在这种情况下使用JOIN吗?最终由于需要使用聚合,(MAX())我相信在这个例子中,性能将与在JOIN中将Select语句添加到WHERE后面的“AND”m1.message_id=语句类型相同。但加入是更好的习惯。因为它将帮助您在将来创建性能更好的语句。“这是我的简短回答”:)你所说的m1是什么意思?我不太确定你对Where部分的确切需求。。我从您发布的失败尝试中推断出了我的示例。m1是我为“message”表指定的别名。(来自消息m1)它工作正常谢谢!我知道我有点过火了,但你能解释一下为什么在这种情况下使用JOIN吗?最终由于需要使用聚合,(MAX())我相信在这个例子中,性能将与在JOIN中将Select语句添加到WHERE后面的“AND”m1.message_id=语句类型相同。但加入是更好的习惯。因为它将帮助您在将来创建性能更好的语句。“这是我的简短回答”:)这也有效,但如果我决定将相关的_消息更改为27,则有点不灵活。例如,这也有效,但如果我决定将相关的_消息更改为27,则有点不灵活。例如,这也有效。谢谢!我对解决方案进行了广泛的测试。当另一个用户(例如person_send_id:50)向他发送消息(person_receive_id 45)时,会出现一个问题。即使相关的消息id不同,也只会显示一条消息。这同样有效。谢谢!我对解决方案进行了广泛的测试。当另一个用户(例如person_send_id:50)向他发送消息(person_receive_id 45)时,会出现一个问题。即使相关的消息id不同,也只会显示一条消息。如果这些解决方案之一是您的答案,请不要忘记选择一条作为答案。提示:)如果这些解决方案中有一个是您的答案,请不要忘记选择一个作为答案。提示:)