2011-09-19 104 views
7

以后我有是一个线程的一部分项的表格,让他们有一个线程ID,每个项目也有一个日期(UNIX时间戳)。所以,我的表看起来像(简体UNIX时间戳):应用WHERE GROUP BY

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

我想要做的是,所有的项目共享相同的线程ID是不是传递的日期选择较小的线程ID。所以,如果我想,所有的项目比1555年长线程ID(日期< 1555),我只希望有线程ID 4回,不是5,即使它有一个项目有日期小于1555原来这就是我尝试:

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

我试图与该查询做的是组上的所有资料线程ID各地的项目具有最高的日期值,并从那里得到其中的日期小于1555,但该项目不工作,它仍然会返回线程ID 5,因为它有一个项目比1555

所以总结年纪大了,我怎么会只选择线程ID,所有的项目都超过特定日期的?

谢谢你的时间!

回答

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

这似乎工作,很简单!谢谢一堆。 – flicker

1

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

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

您的WHERE子句防止HAVING子句者看到来自1555年开始的任何日期,因此在HAVING条件和ORDER BY的组合将再次挑线5个第一。删除WHERE子句(这一次)。 –