Ich habe zwei Tabellen, eine speichert die Benutzer, die andere speichert die E-Mail-Adressen der Benutzer.
userId
, username
, etc
) 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
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:
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.
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:
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
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.