MySQL - Kombinieren von zwei SELECT-Anweisungen in einem Ergebnis mit LIMIT effizient

8

Für eine Dating-Anwendung habe ich ein paar Tabellen, die ich für eine einzelne Ausgabe mit einem LIMIT 10 beider Abfragen zusammensuchen muss. Es scheint im Moment schwierig zu sein, obwohl es kein Problem ist, sie separat abzufragen, aber das LIMIT 10 funktioniert nicht, da die Zahlen nicht exakt sind (zB nicht LIMIT 5 und LIMIT 5, eine Abfrage kann 0 Zeilen zurückgeben , während die anderen 10, abhängig vom Szenario).

%Vor%

Stellen Sie sich vor, Sie sind Karen und haben sich gerade eingeloggt. Sie sollten diese 2 Elemente sehen:

%Vor%

In einer Abfrage mit einem LIMIT von 10. Stattdessen sind hier zwei Abfragen, die kombiniert werden müssen:

%Vor%

Auch hier können manchmal beide Tabellen leer sein, oder eine Tabelle kann leer sein, oder beide sind voll (wobei LIMIT 10 eintritt) und nach Zeit geordnet. Irgendwelche Ideen, wie man eine Abfrage erhält, um diese Aufgabe effizient auszuführen? Gedanken, Ratschläge, Glockenspiele, Optimierungen sind willkommen.

    
Wonka 25.04.2012, 21:49
quelle

1 Antwort

20

Sie können mehrere Abfragen mit UNION kombinieren, jedoch nur bei Abfragen haben die gleiche Anzahl von Spalten. Idealerweise sind die Spalten nicht nur im Datentyp identisch, sondern auch in ihrer semantischen Bedeutung. Allerdings kümmert sich MySQL nicht um die Semantik und behandelt unterschiedliche Datentypen, indem es auf etwas Generischeres aufwirbelt - wenn nötig könnten Sie die Spalten überladen, um verschiedene Bedeutungen von jeder Tabelle zu haben, und dann die Bedeutung bestimmen ist in Ihrem höheren Code angemessen (obwohl ich es nicht so empfehle).

Wenn die Anzahl der Spalten unterschiedlich ist oder wenn Sie eine bessere / weniger überladene Ausrichtung von Daten aus zwei Abfragen erreichen möchten, können Sie Dummy-Literalspalten in Ihre SELECT -Anweisungen einfügen. Zum Beispiel:

%Vor%

Sie könnten sogar einige Spalten für die erste Tabelle und andere für die zweite Tabelle reserviert haben, so dass sie NULL anderswo sind (aber denken Sie daran, dass die Spaltennamen aus der ersten Abfrage stammen. alle dort genannt):

%Vor%

Sie könnten versuchen, Ihre beiden Abfragen auf diese Weise auszurichten und sie dann mit einem Operator UNION zu kombinieren. Wenn Sie LIMIT auf UNION anwenden, sind Sie kurz davor, Ihr Ziel zu erreichen:

%Vor%

Das einzige Problem, das bleibt, ist, dass, wie oben dargestellt, 10 oder mehr Datensätze aus der ersten Tabelle alle Datensätze aus dem zweiten "rausschieben". Allerdings können wir ein ORDER BY in der äußeren Abfrage verwenden, um dies zu lösen.

Alles zusammenfügen:

%Vor%

Natürlich liegt es nun an Ihnen, zu bestimmen, mit welcher Art von Zeile Sie beim Lesen jedes Datensatzes im Resultset arbeiten (schlagen Sie vor, dass Sie request_id und / oder alert_id für NULL -Werte testen; alternativ man könnte den Ergebnissen eine zusätzliche Spalte hinzufügen, die explizit angibt, aus welcher Tabelle jeder Datensatz stammt, aber es sollte äquivalent sein, vorausgesetzt, die id -Spalten sind NOT NULL ).

    
eggyal 25.04.2012, 22:53
quelle

Tags und Links