2011-09-05 26 views
8

Tengo que hacer GROUP BY después de ORDER BY. No entiendo por qué MySQL no es compatible con eso. Este es mi código:GROUP BY después de ORDEN POR

SELECT 
    `pages`.`id`, 
    `contents`.`id_language`, 
    [...] 

[...] 

ORDER BY 
    FIND_IN_SET(`languages`.`id`, '3') DESC 

[the GROUP BY] 

Los resultados serán algo como esto:

id | id_language | ... 
1 3 
1 1 
2 3 
2 5 
2 1 

que necesitan agrupar por ID, necesito sólo el primer resultado y tengo que ahorrar en una vista. No puedo usar SUBQUERY por eso.

El resultado necesita ser:

id | id_language | ... 
1 3 
2 3 

Nota: No se confunda por id_language = 3, porque no es una regla.

Respuesta

1

Agrupar por agrupará conjuntos de resultados, y se utiliza generalmente para la agregación. Ordenar por es la forma en que se ordenan los resultados.

+0

así que no puedo usar GROUP BY para este caso? –

1

Puede que desee una columna adicional en su consulta original que agrupe, junto con lo que está agrupando actualmente. Esa columna, cuando se agrupe, podría usarse para ordenar después. Por ejemplo:

SELECT 
    SUM(IF(`languages`.`id` = 3, 1, 0)) AS languageOrder, 
    `pages`.`id`, 
    `contents`.`id_language`, 
    [...] 

[...] 

[GROUP BY...] 

ORDER BY languageOrder DESC 

Me gustaría que languageOrder sea positivo para los grupos que contienen el lenguaje n. ° 3, 0 en caso contrario. Entonces los grupos que contienen el lenguaje 3 estarán en la parte superior.

+0

El ORDER BY funciona bien, el problema es que necesito SÓLO el primer valor encontrado para cada ID. –

+0

Por lo tanto, si entiendo correctamente, lo que realmente desea es que, para cada grupo, desee que se devuelva la fila que tenga el 3 en el idioma_id. Si solo puede haber una (o ninguna) fila con un 3, entonces puede hacer WHERE language_id = 3. Si puede haber más de uno, ¿cómo puede SQL decidir cuál le mostrará? –

+0

Nop ... El resultado es algo así como '1 | 3',' 1 | 5', '2 | 2',' 2 | 5', por ejemplo ... Necesito obtener, para cada ID, el PRIMER ENCONTRADO FILA ... entonces, el resultado para este ejemplo es '1 | 3' y' 2 | 2' solamente. –

0

muy divertida, tratar

select * from your_table 
where id_language=3 
order by id; 

Por lo que puedo decir, el conjunto de reglas es id_language=3,
que hacen que no hay diferencias entre el uso de where

7
SELECT id, idl 
FROM (SELECT 
    `pages`.`id` as id, 
    `contents`.`id_language` as idl, 
    [...] 

[...] 

ORDER BY 
    FIND_IN_SET(`languages`.`id`, '3') DESC 
    ) d 
GROUP BY d.id