sql >> Base de Datos >  >> RDS >> Mysql

MYSQL Agrupar por columna con 2 filas para cada grupo

Si necesita dos identificadores arbitrarios, utilice min() y max() :

SELECT c.`cat_name` , min(id), max(id)
FROM `info` i INNER JOIN
     `category` c
     ON i.`cat_id` = c.`cat_id`
WHERE c.`cat_name` IS NOT NULL
GROUP BY c`.`cat_name`
ORDER BY c.`cat_name` ASC ;

Nota:está utilizando un LEFT JOIN y luego agregando por una columna en el segundo mesa. Por lo general, esto no es una buena idea, porque las no coincidencias se colocan en un NULL grupo. Además, su WHERE cláusula convierte el LEFT JOIN a una INNER JOIN de todos modos, así que he arreglado eso. El WHERE la cláusula puede ser necesaria o no, dependiendo de si cat_name es siempre NULL .

Si quiere los dos más grandes o los más pequeños, y puede soportar tenerlos en la misma columna:

SELECT c.`cat_name`,
       substring_index(group_concat id order by id), ',', 2) as ids_2 
FROM `info` i INNER JOIN
     `category` c
     ON i.`cat_id` = c.`cat_id`
WHERE c.`cat_name` IS NOT NULL
GROUP BY c`.`cat_name`
ORDER BY c.`cat_name` ASC ;