2011-09-19 7 views
7

スレッドの一部であるアイテムを持つテーブルがあるので、スレッドIDがあり、各アイテムには日付(UNIXタイムスタンプ)もあります。だから私のテーブルのような何か(UNIXタイムスタンプを簡素化)になります。私は何をしたいかGROUP BYの後にWHEREを適用する

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

を同じスレッドIDを共有するすべての項目が渡された日付よりも小さい選択スレッドIDです。したがって、すべてのアイテムが1555より古いスレッドID(日付< 1555)が必要な場合は、1555より小さい日付のアイテムがあるにも関わらず、スレッドID 4が返されるだけで、5は返されません。試してみました:

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

私はそのクエリでやろうとしていることはグループ最高日付の値を持つと日付が未満1555しかし、それであるアイテムを取得し、そこからアイテムの周りにスレッドIDにより、すべての項目があります1555より古いアイテムがあるためスレッドID 5が返されます。

要約すると、すべてのアイテムが特定の日付より古いスレッド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句を削除します(今回)。 –