mySQL sélectionne une colonne DISTINCT, avec les autres colonnes correspondantes

ID FirstName LastName 1 John Doe 2 Bugs Bunny 3 John Johnson 

Je veux sélectionner les résultats DISTINCT dans la colonne FirstName , mais j’ai besoin de l’ ID et du nom correspondant.

Le jeu de résultats doit afficher un seul John , mais avec un ID de 1 et un nom de famille.

essayez cette requête

  SELECT ID, FirstName, LastName FROM table GROUP BY(FirstName) 

Le DISTINCT clé DISTINCT ne fonctionne pas vraiment comme prévu. Lorsque vous utilisez SELECT DISTINCT col1, col2, col3 vous sélectionnez en fait tous les tuples {col1, col2, col3} uniques.

MODIFIER

La réponse d’origine a été écrite avant MySQL 5.7.5 , qui ne s’applique plus en raison des modifications par défaut avec ONLY_FULL_GROUP_BY . Il est également important de noter que lorsque ONLY_FULL_GROUP_BY est désactivé, l’utilisation de GROUP BY sans une fonction d’agrégat donnera des résultats inattendus, car MySQL est libre de choisir N’IMPORTE QUELLE valeur dans l’dataset en cours de regroupement.

En supposant que le prénom et le nom sont indexés de manière unique, une alternative à GROUP BY consiste à sortinger en utilisant un LEFT JOIN pour filtrer le jeu de résultats. Voir la démonstration

Pour récupérer le prénom distinct ordonné par le nom de famille en ordre décroissant (ZA)

 SELECT t1.* FROM table_name AS t1 LEFT JOIN table_name AS t2 ON t1.firstname = t2.firstname AND t1.lastname < t2.lastname WHERE t2.id IS NULL; #Results | id | firstname | lastname | |----|-----------|----------| | 2 | Bugs | Bunny | | 3 | John | Johnson | 

Pour récupérer le prénom distinct ordonné par nom de famille en ordre croissant (AZ)

 SELECT t1.* FROM table_name AS t1 LEFT JOIN table_name AS t2 ON t1.firstname = t2.firstname AND t1.lastname > t2.lastname WHERE t2.id IS NULL; #Results | id | firstname | lastname | |----|-----------|----------| | 2 | Bugs | Bunny | | 1 | John | Doe | 

Vous pouvez ensuite commander les données résultantes comme vous le souhaitez.

Si la première et la dernière combinaison de noms ne sont pas uniques et que vous avez plusieurs lignes de mêmes valeurs, vous pouvez filtrer le jeu de résultats en incluant une condition OU sur la jointure pour choisir un identifiant spécifique. Voir la démonstration .

données nom_table :

 (1, 'John', 'Doe'), (2, 'Bugs', 'Bunny'), (3, 'John', 'Johnson'), (4, 'John', 'Doe'), (5, 'John', 'Johnson') 
 SELECT t1.* FROM table_name AS t1 LEFT JOIN table_name AS t2 ON t1.firstname = t2.firstname AND (t1.lastname > t2.lastname OR (t1.firstname = t1.firstname AND t1.lastname = t2.lastname AND t1.id > t2.id)) WHERE t2.id IS NULL; #Results | id | firstname | lastname | |----|-----------|----------| | 1 | John | Doe | | 2 | Bugs | Bunny | 

ATTENTION

Avec MySQL GROUP BY , les résultats attendus ne seront pas toujours utilisés avec ORDER BY Voir: Exemple de scénario de test .

La meilleure méthode d'implémentation pour garantir les résultats attendus consiste à filtrer l'étendue de l'ensemble de résultats en utilisant une sous-requête comme celle-ci.

données nom_table :

 (1, 'John', 'Doe'), (2, 'Bugs', 'Bunny'), (3, 'John', 'Johnson') 

Question

 SELECT * FROM ( SELECT * FROM table_name ORDER BY ID DESC ) AS t1 GROUP BY FirstName #Results | ID | first | last | |----|-------|---------| | 2 | Bugs | Bunny | | 3 | John | Johnson | 

Contre

 SELECT * FROM table_name GROUP BY FirstName ORDER BY ID DESC #Results | ID | first | last | |----|-------|-------| | 2 | Bugs | Bunny | | 1 | John | Doe | 
 SELECT ID,LastName From TABLE_NAME GROUP BY FirstName HAVING COUNT(*) >=1 

Vous ne savez pas si vous pouvez faire cela avec MySQL, mais vous pouvez utiliser un CTE dans T-SQL

 ; WITH tmpPeople AS ( SELECT DISTINCT(FirstName), MIN(Id) FROM People ) SELECT tP.Id, tP.FirstName, P.LastName FROM tmpPeople tP JOIN People P ON tP.Id = P.Id 

Sinon, vous devrez peut-être utiliser une table temporaire.

 SELECT firstName, ID, LastName from tableName GROUP BY firstName 

Gardez à l’esprit que lorsque vous utilisez le group by by order, MySQL est la SEULE firebase database qui permet d’utiliser des colonnes dans le groupe et / ou de les ordonner par morceau qui ne font pas partie de l’instruction select.

Ainsi par exemple: sélectionnez column1 du groupe de tables par ordre column2 par column3

Cela ne volera pas dans d’autres bases de données comme Postgres, Oracle, MSSQL, etc. Vous devrez suivre les étapes suivantes dans ces bases de données

select column1, column2, column3 du groupe de tables par ordre de column2 par column3

Juste quelques informations au cas où vous migrez votre code actuel dans une autre firebase database ou commencez à travailler dans une autre firebase database et essayez de réutiliser le code.

Vous pouvez utiliser group by pour afficher des valeurs distinctes et également les champs correspondants.

 select * from tabel_name group by FirstName 

Maintenant vous avez une sortie comme ceci:

 ID FirstName LastName 2 Bugs Bunny 1 John Doe 

Si vous voulez répondre comme

 ID FirstName LastName 1 John Doe 2 Bugs Bunny 

puis utilisez cette requête,

 select * from table_name group by FirstName order by ID 
 SELECT DISTINCT(firstName), ID, LastName from tableName GROUP BY firstName 

Serait le meilleur pari IMO.

 select distinct (column1), column2 from table1 group by column1