ERSTER ORDER BY ... DANN GROUP BY

9

Ich habe zwei Tabellen, eine speichert die Benutzer, die andere speichert die E-Mail-Adressen der Benutzer.

  • Tischbenutzer: ( userId , username , etc )
  • Tabelle userEmail: ( emailId , userId , email )

Ich möchte eine Abfrage durchführen, mit der ich die letzte E-Mail-Adresse zusammen mit dem Benutzerdatensatz abrufen kann.
Ich suche im Grunde nach einer Abfrage, die sagt

%Vor%

Dies ist möglich mit:

%Vor%

Aber das tut eine Unterabfrage für jede Zeile und ist sehr ineffizient. (Es ist schneller, zwei separate Abfragen auszuführen und sie in meiner Programmlogik zusammenzufügen).


Die intuitive Abfrage für das, was ich will, wäre:

%Vor%

Aber das funktioniert nicht so, wie ich es möchte. (Das GROUP BY wird vor dem Sortieren ausgeführt, also hat ORDER BY userEmail.emailId nichts zu tun).


Meine Frage ist also:
Ist es möglich, die erste Anfrage zu schreiben, ohne die Unterabfragen zu nutzen?


Ich habe die anderen Fragen zu stackoverflow durchsucht und gelesen, aber keine scheint die Frage zu diesem Abfragemuster zu beantworten.

    
Jacco 12.09.2010, 15:59
quelle

2 Antworten

4
  

Aber das tut eine Unterabfrage für jede Zeile und ist sehr ineffizient

Erstens, haben Sie einen Abfrageplan / Timings, die dies zeigen? Die Art und Weise, wie Sie es gemacht haben (mit dem Subselect), ist sozusagen die "intuitive" Art, dies zu tun. Viele DBMS (obwohl ich mir über MySQL nicht sicher bin) haben Optimierungen für diesen Fall und können die Abfrage nur einmal ausführen.

Alternativ können Sie eine Untertabelle mit NUR (user id, latest email id) Tupeln und JOIN darauf erstellen:

%Vor%     
Cowan 13.09.2010, 10:14
quelle
1

Wenn dies eine Abfrage ist, die Sie oft machen, empfehle ich, Ihre Tabellen zu optimieren, um das zu handhaben.

Ich empfehle, der Tabelle emailId eine Spalte users hinzuzufügen. Wenn ein Benutzer seine E-Mail-Adresse ändert oder eine ältere E-Mail-Adresse als primäre E-Mail-Adresse festlegt, aktualisieren Sie die Zeile des Benutzers in der Tabelle users , um die aktuelle emailId

anzugeben

Sobald Sie Ihren Code für dieses Update geändert haben, können Sie Ihre älteren Daten aktualisieren, um emailId für alle Benutzer festzulegen.

Alternativ können Sie der Tabelle email eine users -Spalte hinzufügen, sodass Sie keine Join-Funktion zum Abrufen der aktuellen E-Mail-Adresse eines Benutzers ausführen müssen.

    
NamshubWriter 12.09.2010 16:19
quelle

Tags und Links