2011-09-19 12 views
7

Tengo una tabla con elementos que son parte de un hilo, por lo que tienen un ID de hilo, cada elemento también tiene una fecha (marca de tiempo UNIX). Así que mi mesa se ve algo como marcas de tiempo (UNIX simplificadas):Aplicar DONDE después de GRUPO POR

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

Lo que quiero hacer es seleccionar la ID de hilo donde TODOS los artículos que comparten el mismo ID del hilo son más pequeños que la fecha pasada. Por lo tanto, si quisiera ID de subprocesos donde TODOS los elementos son anteriores a 1555 (fecha < 1555), solo esperaría que se devuelva la ID de subproceso 4, no 5 aunque tenga un elemento con una fecha menor que 1555. Así que esto es lo que intentado:

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

lo que estoy tratando de hacer con esa consulta es agrupar todos los artículos por el ID del hilo alrededor del elemento con el valor más alto de la fecha y no conseguir los artículos en que la fecha es inferior a 1555. Pero eso no funciona, todavía devolverá el ID de hilo 5 porque tiene un elemento anterior a 1555.

Por lo tanto, para resumir, ¿cómo seleccionaría solo identificadores de subprocesos donde TODOS los artículos son anteriores a una determinada fecha?

¡Gracias por su tiempo!

Respuesta

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

Esto parece funcionar, que era simple! Gracias un montón. – flicker

1

Use una cláusula HAVING. Esto le permite filtrar sobre los agregados como SUM, MAX ... Aquí desea seleccionar sólo aquellos de ID del tema cuya entrada más reciente es mayor que 1555, por lo que se escribe:

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

Su cláusula WHERE impide que la cláusula HAVING vea fechas desde 1555 en adelante, por lo que la combinación de la condición HAVING y ORDER BY seleccionará primero el hilo 5. Suelta la cláusula WHERE (esta vez). –

Cuestiones relacionadas