我有这个表和SQL:
// Table
create table messaging (
fromid integer,
toid integer,
message text,
message_time datetime
);
insert into messaging values (1, 2, 'asdf', '2015-04-01');
insert into messaging values (1, 2, 'asdf', '2015-04-01');
insert into messaging values (3, 1, 'fjfj', '2015-03-04');
insert into messaging values (4, 1, 'lmno', '2015-03-31');
insert into messaging values (4, 1, 'adfzx', '2015-04-03');
// SQL
select id, max(message_time), message
from
(select fromid id, message_time, message
from messaging
where toid = 1
union
select toid id, message_time, message
from messaging
where fromid = 1
) q
group by id
order by max(message_time) desc;
http://sqlfiddle.com/#!9/d248e/3
它会在多个条目中返回fromId
或toId
为1
(条件为MAX(message_time) DESC
)的最后一个条目。它们按日期正确排序,但是如果我得到每个条目的消息值,我就不会收到与该日期相关的消息,而是从id
得到第一条消息。
如何修改查询以便获取与max(message_time)
关联的邮件而不是最早的邮件?
我坚持这一步。
感谢。
答案 0 :(得分:0)
只是聚合函数没有给你相应的行。当您应用多个聚合函数时,尤其可以看到这一点,例如
SELECT MIN(value), MAX(value) FROM your_table;
因此,您必须在WHERE
子句中使用子查询来获取正确的行。 This manual entry应该有所帮助:
保持某一列的分组最大值的行
任务:对于每篇文章,找到价格最贵的经销商或经销商。
这个问题可以通过像这样的子查询来解决:
SELECT article, dealer, price
FROM shop s1
WHERE price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article);
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0001 | B | 3.99 |
| 0002 | A | 10.99 |
| 0003 | C | 1.69 |
| 0004 | D | 19.95 |
+---------+--------+-------+
前面的示例使用相关的子查询,可以是 效率低下(参见第13.2.9.7节“相关子查询”)。其他 解决问题的可能性是使用不相关的 FROM子句中的子查询或LEFT JOIN。
不相关的子查询:
SELECT s1.article, dealer, s1.price
FROM shop s1
JOIN (
SELECT article, MAX(price) AS price
FROM shop
GROUP BY article) AS s2
ON s1.article = s2.article AND s1.price = s2.price;
LEFT JOIN:
SELECT s1.article, s1.dealer, s1.price
FROM shop s1
LEFT JOIN shop s2 ON s1.article = s2.article AND s1.price < s2.price
WHERE s2.article IS NULL;
LEFT JOIN的工作原理是当s1.price达到最大值时 值,没有s2.price具有更大的值和s2行 值将为NULL。