Mysql
 sql >> Base de données >  >> RDS >> Mysql

MYSQL Grouper par colonne avec 2 lignes pour chaque groupe

Si vous avez besoin de deux identifiants arbitraires, utilisez alors min() et 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 ;

Remarque :Vous utilisez une LEFT JOIN puis agrégation par une colonne dans la seconde table. Ce n'est généralement pas une bonne idée, car les non-correspondances sont toutes placées dans un NULL groupe. De plus, votre WHERE la clause transforme le LEFT JOIN à un INNER JOIN de toute façon, donc j'ai corrigé ça. Le WHERE clause peut ou non être nécessaire, selon que cat_name est toujours NULL .

Si vous voulez les deux plus grands ou les plus petits -- et que vous pouvez supporter de les avoir dans la même colonne :

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 ;