在GROUP BY之后应用WHERE

时间:2011-09-19 03:55:46

标签: mysql group-by

我有一个表,其中的项目是一个线程的一部分,因此它们有一个线程ID,每个项目也有一个日期(UNIX时间戳)。所以我的表看起来像(UNIX时间戳简化):

+-----------------------------+
|  id |   date  |  thread_id  |
+-----+---------+-------------+
|  1  |   1111  |      4      |
|  2  |   1333  |      4      |
|  3  |   1444  |      5      |
|  4  |   1666  |      5      |
+-----------------------------+

我想要做的是选择线程ID,其中共享相同线程ID的所有项都小于传递的日期。因此,如果我想要所有项目早于1555(日期< 1555)的线程ID,我只希望返回线程ID 4,而不是5,即使它有一个日期小于1555的项目。所以这就是我试过了:

SELECT * FROM table WHERE date < 1555 GROUP BY thread_id ORDER BY date DESC

我正在尝试对该查询进行的操作是按照具有最高日期值的项目的线程ID对所有项目进行分组,并从那里获取日期小于1555的项目。但这不起作用,它仍将返回线程ID 5,因为它有一个超过1555的项目。

总而言之,我如何只选择所有项目都超过特定日期的线程ID?

感谢您的时间!

2 个答案:

答案 0 :(得分:22)

SELECT thread_id FROM table GROUP BY thread_id HAVING MAX(date) < 1555

答案 1 :(得分:5)

使用HAVING子句。这允许你过滤像SUM,MAX这样的聚合......在这里你只想选择最新条目早于1555的那些线程id,所以你写:

SELECT * FROM table 
    GROUP BY thread_id 
    HAVING MAX(date) < 1555
    ORDER BY date DESC