MySQL组,加入并选择Max

标签 mysql join group-by max

首先,我知道这里有人问过类似的问题,我已经检查过但找不到适合我的问题的解决方案。

我有这两个表(为简单起见,只修剪了必需的部分):

CREATE TABLE messages(
message_id MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
message_conversation_id MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0', 
message_from MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
message_to MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
message_text TEXT NOT NULL DEFAULT '',
PRIMARY KEY (message_id),
KEY message_conversation_id (message_conversation_id),
KEY message_from (message_from),
KEY message_to (message_to)
) ENGINE=INNODB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE users (
user_id MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
user_name VARCHAR(400) NOT NULL DEFAULT '', 
PRIMARY KEY (user_id)
) ENGINE=INNODB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

我想做一个查询,它显示最大的 message_id 的 message_text 和用户的信息(可能都存储在 message_from 或 message_to,并用 where 子句过滤(简单地说:消息会传给我,并向我提供其他用户的信息用户信息,因为在那次对话中,最后一条消息可能来 self 或对话中的其他人)(这让我陷入了解决)。

这个查询是我到目前为止想出的:

SELECT `m`.*, `u`.*, `u2`.*
FROM (`messages` AS m)
INNER JOIN `users` AS u ON `u`.`user_id`=`m`.`message_from`
INNER JOIN `users` AS u2 ON `u2`.`user_id`=`m`.`message_to`
WHERE (m.message_from="1" OR m.message_to="1")
AND `u`.`user_id` != '1'
AND `u2`.`user_id` != '1'
GROUP BY `m`.`message_conversation_id`
ORDER BY `m`.`message_id` desc

这个查询准确地显示了我所需要的(我猜),除了它提供了消息表中的最低值。

我该怎么做?我哪里做错了?

谢谢,

最佳答案

这是获取每个对话的最新消息的另一种方法。

SELECT m.*, u.*, u2.*
FROM (`messages` AS m)
LEFT JOIN users AS u ON u.user_id=m.message_from
LEFT JOIN users AS u2 ON u2.user_id=m.message_to
WHERE (m.`message_from` != 1 AND m.`message_to` != 1) AND m.`message_id` IN (
    SELECT MAX(`message_id`) 
    FROM `messages` 
    GROUP BY `message_conversation_id` 
    HAVING `message_id` = m.`message_id`)
ORDER BY m.message_id DESC;

解释一下,结果是“Using where; Using index”,意思是“任务完成”。

关于MySQL组,加入并选择Max,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11210887/

相关文章:

php - 存储值供以后在没有数据库的情况下使用

php - 数据插入到数据库中,即使它已经存在

mysql - 使用 ElasticSearch 使用 or 和运算符搜索多个字段

mysql - 如何强制表中的唯一性?

sql - 将表格分组为 15 分钟间隔

python - Pandas:匿名 client_id 列,无法回滚

sql - 当没有行返回时,TSQL COUNT 显示 0

MySQL 查询 - 根据前提条件连接不同的表(从不同表检索的值)

python - 使用条件在 python pandas 中进行内部连接

SQL 分组限制