2014-01-05 10 views
8

zurück Ich habe 2 Tabellen in meiner Datenbank. Eine mit dem Namen data, eine andere mit dem Namen changes.MySQL Distinct und LINKE JOIN gibt doppelte

Die Spalten der Tabelle sind

Data

------------ 
|id | name | 
|----------- 
|1 | Test | 
|2 | Hello| 
------------ 

changes

------------------------------------ 
|id | name | related_id | Comments | 
|----------------------------------- 
|1 | Test |  1  | Example | 
|2 | Hello|  2  | Example2 | 
|3 | Hello|  2  | Example3 | 
------------------------------------ 

Wie Sie sehen können, changes. related_id ist ein Fremdschlüssel zu data. id. changes kann mehrere Zeilen der gleichen name und related_id und verschiedene Kommentare haben.

Nach dem Ausführen dieser Abfrage erkannte ich, dass mehrere Zeilen zurückgegeben werden, wo zum Beispiel Hello 2 Mal angezeigt werden kann.

SELECT DISTINCT data.name, changes.comments FROM data LEFT JOIN changes ON data.id = changes.related_id

Result

-------------------- 
|name | comments | 
|------------------- 
|Hello | Example2 | 
|Hello | Example3 | 
-------------------- 

Wie gehe ich darauf achten, dass nur 1 Zeile zurückgegeben wird? Ich ging nach SO, um nach Antworten zu suchen, und viele gaben an, DISTINCT zu verwenden, doch in meinem Fall funktioniert es nicht.

Vielen Dank im Voraus.

+2

Sie erhalten 2 verschiedene Datensätze zurückgegeben. Welcher Kommentar sollte zurückgegeben werden und warum? –

+0

Alle Datensätze können zurückgegeben werden. Ich wollte nur einen eindeutigen 'Namen' mit allen zugehörigen Daten. Ist das möglich? – user2301818

+1

Wenn Sie nur den 'name' brauchen, dann wählen Sie nur den' name': 'SELECT DISTINCT data.name FROM data ...' Aber dann brauchen Sie nicht einmal einen 'join' –

Antwort

14

Wenn Sie nur ein Datensatz in Ihrer data Tabelle für jeden Namen wollen und es kann jeder Datensatz sein, dann können Sie Gruppe durch die einzigartige Spalte (name) und verwenden eine Aggregatfunktion auf der anderen Säule wie max()

SELECT data.name, max(changes.comments) 
FROM data 
LEFT JOIN changes ON data.id = changes.related_id 
GROUP BY data.name 
+0

das ist nur wow..mysql hat keine reihenanzahl/partition funktionen –

+0

Großartig! Sie schaffen es, mein Problem zu lösen! Ich danke dir sehr! Habe heute etwas neues gelernt :) – user2301818

+0

+1 für GROUP BY data.name – bizzr3