mySQL wählt eine Spalte DISTINCT mit entsprechenden anderen Spalten aus

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

Ich möchte DISTINCT Ergebnisse aus der FirstName Spalte auswählen, aber ich brauche die entsprechende ID und LastName .

Die Ergebnismenge muss nur einen John , aber mit einer ID von 1 und einem LastName von Doe zeigen.

versuchen Sie diese Abfrage

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

Das DISTINCT Schlüsselwort funktioniert nicht so, wie Sie es erwarten. Wenn Sie SELECT DISTINCT col1, col2, col3 Sie tatsächlich alle eindeutigen {col1, col2, col3} Tupel aus.

BEARBEITEN

Die ursprüngliche Antwort wurde vor MySQL 5.7.5 geschrieben , die aufgrund der Standardänderungen mit ONLY_FULL_GROUP_BY nicht mehr gilt. Es ist auch wichtig zu beachten, dass bei Verwendung von ONLY_FULL_GROUP_BY die Verwendung von GROUP BY ohne eine Aggregatfunktion zu unerwarteten Ergebnissen führt, da MySQL frei ist, irgendeinen Wert innerhalb des gruppierten Datensatzes zu wählen [sic] .

Unter der Annahme, dass der Vorname und der Nachname eindeutig indiziert sind, ist eine Alternative zu GROUP BY das Sortieren nach einem LEFT JOIN , um die Ergebnismenge zu filtern. Siehe Demonstration

Um den eindeutigen Nachnamen abzurufen, sortiert nach dem Nachnamen in absteigender Reihenfolge (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 | 

Abrufen des eindeutigen Vornamens, geordnet nach Nachnamen in aufsteigender Reihenfolge (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 | 

Sie können dann die resultierenden Daten wie gewünscht bestellen.

Wenn die Kombination aus Vor- und Nachname nicht eindeutig ist und Sie mehrere Zeilen mit denselben Werten haben, können Sie die Ergebnismenge filtern, indem Sie eine ODER-Bedingung in den Join einfügen, um eine bestimmte ID auszuwählen. Siehe die Demonstration .

Tabellenname Daten :

 (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 | 

WARNUNG

Mit MySQL liefert GROUP BY nicht immer die erwarteten Ergebnisse, wenn es mit ORDER BY Siehe: Beispiel für einen Testfall .

Die beste Methode zur Implementierung der erwarteten Ergebnisse besteht darin, den Ergebnismengenbereich mithilfe einer Unterabfrage wie folgt zu filtern.

Tabellenname Daten :

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

Abfrage

 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 | 

Gegen

 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 

Nicht sicher, ob Sie das mit MySQL machen können, aber Sie können ein CTE in T-SQL verwenden

 ; 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 

Andernfalls müssen Sie möglicherweise eine temporäre Tabelle verwenden.

 SELECT firstName, ID, LastName from tableName GROUP BY firstName 

Beachten Sie bei der Verwendung der Gruppe by und order, dass MySQL die EINZIGE database ist, die es erlaubt, Spalten in der Gruppe by und / oder Stück für Stück zu verwenden, die nicht Teil der SELECT-statement sind.

So zum Beispiel: Wählen Sie Spalte1 aus Tabellengruppe nach Spalte2 nach Spalte3

Das wird in anderen databaseen wie Postgres, Oracle, MSSQL usw. nicht funktionieren. In diesen databaseen müssten Sie folgendes tun

Wählen Sie column1, column2, column3 aus der Tabellengruppe nach column2 order by column3 aus

Nur ein paar Informationen für den Fall, dass Sie Ihren aktuellen Code in eine andere database migrieren oder in einer anderen database arbeiten und versuchen, Code wiederzuverwenden.

Sie können group by verwenden, um verschiedene Werte und auch entsprechende Felder anzuzeigen.

 select * from tabel_name group by FirstName 

Jetzt hast du folgendes ausgegeben:

 ID FirstName LastName 2 Bugs Bunny 1 John Doe 

Wenn du wie antworten möchtest

 ID FirstName LastName 1 John Doe 2 Bugs Bunny 

dann benutze diese Abfrage,

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

Wäre die beste Wette IMO.

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