在GROUP BY之后应用WHERE

fli*_*ker 10 mysql group-by

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

+-----------------------------+
|  id |   date  |  thread_id  |
+-----+---------+-------------+
|  1  |   1111  |      4      |
|  2  |   1333  |      4      |
|  3  |   1444  |      5      |
|  4  |   1666  |      5      |
+-----------------------------+
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM table WHERE date < 1555 GROUP BY thread_id ORDER BY date DESC
Run Code Online (Sandbox Code Playgroud)

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

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

感谢您的时间!

Nie*_*asz 23

SELECT thread_id FROM table GROUP BY thread_id HAVING MAX(date) < 1555
Run Code Online (Sandbox Code Playgroud)

  • 如果我想`SELECT MAX(date) thread_id FROM table GROUP BY thread_id HAVING MAX(date) &lt; 1555`,效率怎么样?我的意思是,“MAX(date)”会被计算两次吗? (2认同)

Jef*_*Sax 5

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

SELECT * FROM table 
    GROUP BY thread_id 
    HAVING MAX(date) < 1555
    ORDER BY date DESC  
Run Code Online (Sandbox Code Playgroud)