2011-09-19 16 views
7

Ho una tabella con elementi che fanno parte di un thread, quindi hanno un ID di thread, ogni elemento ha anche una data (UNIX timestamp). Quindi il mio tavolo sembra qualcosa di simile (timestamp UNIX semplificato):Applica WHERE dopo GROUP BY

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

Quello che voglio fare è selezionare gli ID di thread in cui tutti gli oggetti che condividono lo stesso ID del thread sono più piccole rispetto alla data passata. Quindi, se volessi ID di thread in cui TUTTI gli articoli fossero più vecchi di 1555 (data < 1555), mi sarei solo aspettato di avere l'ID di thread 4 restituito, non 5 anche se ha un elemento con una data inferiore a 1555. Quindi questo è quello che provato:

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

quello che sto cercando di fare con quella domanda è il gruppo di tutti gli elementi di ID filo intorno la voce con il valore di data più alto e da lì ottenere gli elementi in cui la data è inferiore a 1555. Ma questo non funziona, verrà comunque restituito il thread ID 5 perché ha un articolo precedente al 1555.

Quindi, per riassumere, come selezionerei solo ID di thread in cui TUTTI gli articoli sono precedenti a una certa data?

Grazie per il vostro tempo!

risposta

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

Questo sembra funzionare, che era semplice! Grazie mille. – flicker

1

Utilizzare una clausola HAVING. Questo consente di filtrare sugli aggregati come SUM, MAX ... Qui si desidera selezionare solo i filo id la cui entrata più recente è più vecchio di 1555, in modo che si scrive:

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

La clausola WHERE impedisce alla clausola HAVING di vedere qualsiasi data dal 1555 in poi, quindi la combinazione della condizione HAVING e di ORDER BY selezionerà nuovamente il thread 5. Rilascia la clausola WHERE (questa volta). –