SQL: Wie halten Sie Zeilen, um mit DISTINCT?
Die folgende SQL-Abfrage:
SELECT messages.id, messages.created_at, comments.created_at FROM messages
LEFT JOIN comments ON comments.message_id = messages.id
WHERE (messages.id IN (429,443))
ORDER BY GREATEST(messages.created_at, comments.created_at) DESC
gibt:
id messages.created_at comments.created_at
--------------------------------------------------------
443 2 5
429 1 4
443 2 3
(I replaced dates with numbers for readability)
Zu bekommen jede id
nur einmal habe ich Hinzugefügt DISTINCT
:
SELECT DISTINCT messages.id FROM messages
LEFT JOIN comments ON comments.message_id = messages.id
WHERE (messages.id IN (429,443))
ORDER BY GREATEST(messages.created_at, comments.created_at) DESC
Aber, in der das Ergebnis der id
Werte geändert werden, um:
id
---
429
443
Was könnte der Grund dafür ?
Wie könnte ich die bestellen ?
- Meine Vermutung ist, dass mysql Stoppt, nachdem er die ersten beiden Spiele und ordnet diese entsprechend. Wahrscheinlich die letzten beiden Einträge sind gefunden zu werden, Erstens weil Sie eingefügt wurden erste Beurteilung durch Ihre Nutzung des created_at.
- Ich bin mir nicht sicher, aber Sie nicht wirklich wissen, welche der Zeilen, die Sie behalten, nachdem das deutlich. Ich bin mir nicht sicher, wie mysql funktioniert. Es wäre interessant zu sehen, dass Sie beide Abfragen ausführen und umfassen sowohl created_at Spalten.
SELECT messages.id, messages.created_at, comments.created_at
so können wir sehen, wie die Werte der anderen Spalten, da das ist, was Sie die Bestellung durch. Ich vermute, dass die created_at für429
höher ist als der created_at für443
- Ich aktualisiert die Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
den
distinct
key word tut was es tun soll, eine Zeile zurückgeben jede mit einer bestimmten Spalte Wert. Distinct kann man nicht angeben die solche Zeile wird zurückgegeben, und es ist klar von der ursprünglichen Abfrage, dass eine solche Bestellung zulässig ist (es gibt eine Zeile mit id 443, folgt eine Zeile mit der id 429).Kontrollieren, welche Zeilen zurückgegeben werden, die Sie benötigen, zu formulieren, die die Abfrage. Eine typische Lösung, die ich nehmen werde, ist die Verwendung eines
group by
, die Auswahl der Gruppen-Spalte und die gewünschte Zeile aus jeder Gruppe, die etwas zum Effekt vonWenn ich mehr tun, ich werde diese Art der Abfrage als einer untergeordneten select-Anweisung in einer größeren Abfrage, die möglicherweise Eintritt, die auf das id-Feld, um mehrere Felder aus der am günstigsten gelegene Zeile, Oder die Bestellung der Abfrage auf eine bestimmte Weise.
GROUP BY
scheint ein vernünftiger Ansatz.