此问题 SQL select only rows with max value on a column 虽然已被标记为重复,但并未解决我的问题。
假设我的列from_id
和to_id
是主键,当他们没有这样的约束时(请参阅下面提供的代码)。如果它们是主键,我就无法将我的消息存储在同一个表中。因此,此答案的SQL查询多次打印所有重复项,这是不我想要的。请参阅下面的预期行为。
预期行为:我需要从所有会话中选择最新消息,无论用户是否只是发件人,收件人或两者。每个对话/话题只应显示一次。
示例:查询此表时,我的SQL语句应该只输出msg3和msg4,忽略John和Alice交换的所有先前消息。
这是我能写的最接近的查询。问题是此查询仅选择用户收到消息的对话。我一直在添加对话,其中用户只是发件人(他没有得到任何答复)。
SELECT * FROM messages where `to_id` = '1' GROUP BY `from_id` ORDER BY `send_date` ASC
以下是users
和messages
表:
CREATE TABLE users (
id INT(11) AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(128) NOT NULL
);
CREATE TABLE messages (
id INT(11) AUTO_INCREMENT PRIMARY KEY,
to_id INT(11) NOT NULL, //recipient id to match to current user id
from_id INT(11) NOT NULL, //sender id to match to current user id
send_date DATETIME DEFAULT CURRENT_TIMESTAMP,
content TEXT
);
问题:如何使用单个SQL查询执行此操作?或者我应该使用三个表而不是一个表来更改我的数据结构?
答案 0 :(得分:2)
我会先得到ids。您可以使用least()
和greatest()
:
select least(m.to_id, m.from_id) as id1,
greatest(m.to_id, m.from_id) as id2, max(m.id) as max_id
from messages m
group by id1, id2;
然后,您可以通过join
返回
select m.*
from messages m
where m.id in (select max(m.id) as max_id
from messages m
group by least(m.to_id, m.from_id), greatest(m.to_id, m.from_id)
);
注意:在旧版本的MySQL中,将子查询放在from
子句中并使用join
会更有效。