其中一个条目与其他结果条目无关

时间:2015-04-12 06:44:16

标签: mysql

我有这个表和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

它会在多个条目中返回fromIdtoId1(条件为MAX(message_time) DESC)的最后一个条目。它们按日期正确排序,但是如果我得到每个条目的消息值,我就不会收到与该日期相关的消息,而是从id得到第一条消息。

如何修改查询以便获取与max(message_time)关联的邮件而不是最早的邮件?

我坚持这一步。

感谢。

1 个答案:

答案 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。