MySQL-Rückgabe von Ergebnissen aus einer Tabelle, basierend auf Daten in einer anderen Tabelle
Vor dem eintauchen in das Problem, zuerst erkläre ich die situation. Ich habe zwei Tabellen wie der folgenden:
USERS TABLE
user_id
username
firstName
lastName
GROUPS TABLE
user_id
group_id
Ich abrufen möchten, alle Anwender, die erste name LIKE '%foo%' und wer ist ein Teil einer Gruppe mit group_id = 'givengid'
So, die Abfrage würde wie so etwas wie dieses:
SELECT user_id FROM users WHERE firstName LIKE '%foo'"
Kann ich eine benutzerdefinierte sql-Funktion wie ismember(user_id, group_id), das gibt 1 zurück, wenn der Benutzer ist ein Teil der Gruppe und 0, wenn Sie nicht sind, und diese in der WHERE-Klausel in der oben genannten select-Anweisung. Dies bedeutet jedoch, dass für jeden Benutzer, der erste name, der den Kriterien entspricht, einer anderen Abfrage muss ausgeführt werden, durch Tausende von andere Datensätze zu finden eine mögliche übereinstimmung für eine Gruppe Eintrag.
Den Benutzern und Gruppen Tabelle werden jeweils mehrere hunderttausend Datensätze. Ist es mehr die herkömmlichen zu verwenden, die Benutzer-definierte Funktion Ansatz oder führen Sie eine Abfrage mithilfe der UNION-Anweisung? Wenn das Konzept der UNION ist das beste, was wäre die Abfrage mit der union-Anweisung Aussehen?
Natürlich werde ich ausführen von benchmarks, aber ich will einfach nur, um einige Perspektive auf die möglichen Lösungen für diese situation und was ist in der Regel die meisten effektiv/effizient.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie eine BEITRETEN, um Benutzer gefunden, die Ihren zwei Kriterien.
Brauchen Sie nicht, um entweder eine
UNION
oder eine Benutzer-definierte Funktion hier; verwenden Sie stattdessen eineJOIN
(die können Sie join einer Tabelle in eine andere, basierend auf einem äquivalent-Spalten):Was diese Abfrage macht, ist join-Zeilen in der
groups
Tabelle um Zeilen in derusers
Tisch, wenn die user_id ist die gleiche (also, wenn Sie verwendenSELECT *
, Sie würden am Ende mit einer langen Zeile mit den Daten der Benutzer und die Gruppe Daten für diesen Benutzer). Wenn mehreregroups
Zeilen für den Benutzer gibt, die mehrere Zeilen abgerufen werden, bevor Sie gefiltert durch dieWHERE
- Klausel.Verwenden Sie eine Verknüpfung:
Den
DISTINCT
macht Sie sicher nicht mit doppelten Benutzer-IDs in das Ergebnis.