Alternative zur Verwendung von GROUP BY ohne Aggregate abrufen unterschiedliche "beste" Ergebnis
Ich versuche zum abrufen der "Best" möglichen Eintrag aus einer SQL-Tabelle.
Betrachten Sie eine Tabelle mit tv-shows:
id, Titel, episode, is_hidef, is_verified
eg:
id title ep hidef verified
1 The Simpsons 1 True False
2 The Simpsons 1 True True
3 The Simpsons 1 True True
4 The Simpsons 2 False False
5 The Simpsons 2 True False
Kann es doppelte Zeilen für einen einzigen Titel und episode, die möglicherweise oder möglicherweise nicht unterschiedliche Werte für den boolean-Felder. Es können weitere Spalten mit zusätzlichen Informationen, aber das ist unwichtig.
Ich möchte ein ResultSet, das gibt mir die beste Zeile (also is_hidef und is_verified sind beide "wahr" soweit möglich) für jede episode. Für Zeilen, die als "gleich" ich will die letzten Zeilen (Natur-Bestellung oder Bestellung durch eine frei wählbare datetime-Spalte).
3 The Simpsons 1 True True
5 The Simpsons 2 True False
Ich In der Vergangenheit benutzt haben, Sie die folgende Abfrage:
SELECT * FROM shows WHERE title='The Simpsons' GROUP BY episode ORDER BY is_hidef, is_verified
Diese arbeiten unter MySQL und SQLite, aber geht gegen die SQL-spec (GRUPPE DURCH die Forderung aggragates etc etc). Ich bin nicht wirklich daran interessiert zu hören, wieder, warum MySQL so schlecht, dafür, dass dieses; aber ich bin sehr daran interessiert, eine alternative Lösung, die die Arbeit auf anderen Motoren auch (Bonuspunkte, wenn du mir das django ORM-code).
Dank =)
Meinen immerwährenden Dank? Ernst tho: es gibt keine echte Belohnung :p
Ich glaube nicht, dass es Weise - ohne die Verwendung eines
JOIN
- zu sagen, die DB-Engines, die es ermöglichen, diese Art von Gruppierung, welche zufällige Zeile, die Sie wollen.Ich bin nicht dagegen, eine Lösung mit einer Verknüpfung. Ich bin der Hoffnung, für eine Lösung, die keine GROUP BY-obwohl (oder wenn es funktioniert, dann für die Einhaltung der SQL-spec).
ist das für SQL(T-Sql) oder MySql?
InformationsquelleAutor Tyris | 2011-01-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist im Grunde eine form der groupwise-maximal-mit-Krawatten-problem. Ich glaube nicht, dass es eine SQL-standard-konforme Lösung. Eine Lösung wie diese durchführen würden schön:
Aber angesichts der Kosten der Lesbarkeit, ich würde bleiben Sie bei Ihrem ursprünglichen Abfrage.
Der link, den Sie war wirklich hilfreich und ich habe fashioned eine Lösung, mit der Sie Ihre post und den link. Ich werde raw() in django, aber das ist gut, denke ich.
Dies funktioniert für mich. Aber denken Praktikanten der performance, das ist zu schwer. Nehmen sich viel Zeit, um ausführen für 45 Aufzeichnungen über die 'Group By'. Gibt es eine Möglichkeit, die wir optimieren können, die über Abfrage?
InformationsquelleAutor Andomar
In gewisser Weise ähnlich zu Andomar ist, aber dieses funktioniert wirklich.
Die erste Ebene tiebreak wandelt bits (SQL Server) oder MySQL boolean einen integer-Wert *1, und die Spalten die Hinzugefügt werden zur Herstellung des "besten" Wert. Sie können geben Sie GEWICHTE, z.B. wenn hidef > verifiziert, dann verwenden Sie hidef*2 + verified*1, die 3,2,1 oder 0.
Die 2. Ebene sieht unter denen der "best" - Szenario und extrahiert die minimale ID (oder einem anderen tie-break-Spalte). Dies ist notwendig, um die multi-match-Ergebnis auf nur einen Datensatz.
In diesem speziellen Fall (Tabelle, schema), dem äußeren auswählen, verwendet die direct-Taste zum abrufen der gematchten Datensätze.
Was Teil meiner Abfrage nicht funktioniert?
Der Teil, der sagt "LIMIT 1". Die Frage war ungefähr "...funktioniert unter MySQL und SQLite, aber geht gegen die SQL-spec...", so dachte ich, eine ANSI-SQL92-konforme Lösung gesucht wurde. LIMIT nicht
Ich wusste gar nicht BEGRENZEN, nicht Normen-konform =( .. ich hätte ein bisschen mehr spielen, um mit beiden Lösungen. Da LIMIT unterstützt Sie in allen Datenbanken, die ich bin wahrscheinlich immer mit ich gehen kann, dass man mit. Danke für die info =)
Ja, meine Antwort sagt, dass es nicht Normen-konform. Ich weiß nicht, einen Weg zur Lösung von Bindungen innerhalb dem SQL-Standard. Deine Lösung nicht (d.h. es wird wiederholen Sie die Zeilen 2 und 3)
InformationsquelleAutor RichardTheKiwi