2010-03-02 17 views
11

Por lo que sé mysql GROUP BY grupos para el último registro encontrado.GRUPO POR devolver el primer registro

¿Hay alguna solución para GROUP BY en el primer registro?

He configurado el comando ORDER en SQL y necesito GROUP BY devolver el primer registro y no el último.

EDITAR

Ésta es la consulta

SELECT 
    DISTINCT(master.masterID), 
    langData.*, 
    master.* 
FROM master_table as master 
INNER JOIN lang_table as langData ON 
langData.masterID=master.masterID 
GROUP BY master.masterID 
ORDER BY 
CASE 
    WHEN langData.lang='currentLang' THEN 1 ELSE 999 END , 
    master.name desc LIMIT 0,10 

La consulta anterior seleccionar el masterID para la tabla de idiomas múltiples y supongamos que volver PRIMEROS los registros en currentLang y ordenarlas por nombre y luego todos los demás idiomas.

No me preguntes por qué no configuro el idioma en UNIR. Este es el camino a seguir.

Así que todo funciona bien hasta ahora, espere el escenario que tengo un registro con los idiomas en y fr. Si es currentLangen continuación, basado en

langData.lang='currentLang' THEN 1 ELSE 999 END 

el orden en es 1 y fr orden es 999 y en lugar de obtener el valor de en consigo el valor de fr.

Es por eso que quiero agrupar en la primera fila.

+0

que no le pedirá que ¿por qué no se establece el idioma en el 'JOIN' , más bien te diré que de esta manera no funcionará. Una expresión no agregada en 'GROUP BY 'devuelve un registro arbitrario de cada grupo y no debe usarse si los valores varían. Puede devolver cualquier registro de 'tabla_maestro' (todos serán iguales dentro de cada grupo) pero no de' lang_table'. No hay garantía sobre qué registro se devolverá, nada, niente. 'Por cierto', ¿por qué tienes 'DISTINCT' aquí, cuál es su propósito? – Quassnoi

+0

Estoy tratando de lograr "darme primero todos los registros de la orden de idioma actual por nombre y luego para todos los demás idiomas ordenar por nombre" Significado: si lang actual es EN, obtenga todos los registros de EN y luego obtenga todos los registros de otras lenguas. SI en la tabla lang para un registro tiene EN, FR devuelve el valor EN.IF en la tabla lang EN no existe, devuelva cualquier otra lang – ntan

+0

esto es muy fácil de hacer con un 'JOIN' como se describe aquí: http: // explainextended. com/2009/08/10/fallback-language-names-mysql/pero por alguna extraña razón (que ni siquiera quiere que le pidan) es reacio a usarlo. – Quassnoi

Respuesta

11

Asumo que está hablando de algo así como

SELECT * 
FROM mytable 
GROUP BY 
     column 

no debería utilizar expresiones no agregadas en GROUP BY a menos que sean todos iguales dentro del grupo.

Si desea devolver el registro de la celebración de la menor valor de una expresión dentro de un grupo, utilice la siguiente:

SELECT mo.* 
FROM (
     SELECT DISTINCT column 
     FROM mytable 
     ) md 
JOIN mytable mo 
ON  mo.id = 
     (
     SELECT id 
     FROM mytable mi 
     WHERE mi.column = md.column 
     ORDER BY 
       mi.column, mi.someorder 
     LIMIT 1 
     ) 
1

Agregue LIMIT 1 a su consulta.

+0

no es posible. Registro de lectura para la cuadrícula y paginación – ntan

Cuestiones relacionadas