Ich habe zwei Tabellen, die Benutzerinformationen und eine 'Freunde' Beziehung zwischen Benutzern enthalten. Um zu vermeiden, dass eine Beziehung als "keine Freunde" zwischen jedem Benutzer und jedem anderen Benutzer definiert wird, habe ich entschieden, Benutzer ohne Beziehung in der Beziehungstabelle als Freunde zu definieren.Wie lege ich einen Standardwert für eine Unterabfrage ohne Ergebnisse Zeile für Zeile fest?
Wie auch immer ich jetzt versuche, eine Suchfunktion zu implementieren, um Benutzern mit hinzugefügten Personen als ihre Freunde zu helfen, habe ich versucht, eine Liste anderer Benutzer zurück zu geben, deren Namen einem gesuchten Namen entsprechen; Ich versuche auch, den Beziehungsstatus zwischen dem suchenden Benutzer und den Ergebnisbenutzern auszugeben, und ich versuche IFNULL
zu verwenden, um den Rückgabewert festzulegen, wenn keine Beziehung besteht.
Die Abfrage, die ich geschrieben habe, funktioniert gut für einen einzelnen Benutzer, aber wenn die Ergebnisse der Unterabfrage mehrere Benutzer zurückgeben, wird die IFNULL
Anweisung nicht Zeile für Zeile aufgerufen und stattdessen nur die gesamte Ergebnistabelle aufgerufen ist leer.
Hier sind meine Tabellen:
user_table
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
| 1 | John | Doe |
| 2 | Jane | One |
| 3 | Jane | Two |
| 4 | Jane | Three |
+----+------------+-----------+
relationship_table
+-----------+-------------+--------------+
| sender_id | receiver_id | relationship |
+-----------+-------------+--------------+
| 1 | 2 | friends |
| 3 | 1 | pending |
+-----------+-------------+--------------+
Ich versuche, durch den Benutzer John Doe die folgenden wenn eine Suche nach "jane"
ausgeführt, um zu erzeugen.
results
+----+------------+-----------+--------------+
| id | first_name | last_name | relationship |
+----+------------+-----------+--------------+
| 2 | Jane | One | friends |
| 3 | Jane | Two | pending |
| 4 | Jane | Three | not friends |
+----+------------+-----------+--------------+
Hier ist die Abfrage, die ich derzeit haben:
SELECT user_table.id, user_table.first_name, user_table.last_name, derived_table.relationship
FROM user_table, (
SELECT IFNULL((type), 'not friends') AS relationship
FROM relationship_table
WHERE sender_id IN (
SELECT id
FROM user_table
WHERE first_name LIKE 'jane%'
OR last_name LIKE 'jane%'
AND id != '1'
)
AND receiver_id = '1'
OR receiver_id IN (
SELECT id
FROM user_table
WHERE first_name LIKE 'jane%'
OR last_name LIKE 'jane%'
AND id != '1'
)
AND sender_id = '1'
)derived_table
WHERE first_name LIKE 'jane%'
OR last_name LIKE 'jane%'
AND user_table.id != '1'
Diese Abfrage zur Zeit kehrt diese für die Suche von "jane"
:
+----+------------+-----------+--------------+
| id | first_name | last_name | relationship |
+----+------------+-----------+--------------+
| 2 | Jane | One | friends |
| 2 | Jane | One | pending |
| 3 | Jane | Two | friends |
| 3 | Jane | Two | pending |
| 4 | Jane | Three | friends |
| 4 | Jane | Three | pending |
+----+------------+-----------+--------------+
Es mir klar, ist der Grund dafür, da ist Das gesamte Ergebnis der Beziehungs-Unterabfrage wird zu jedem Satz von Benutzerdaten hinzugefügt, anstatt mit dem entsprechenden Benutzer übereinzustimmen.
Logic sagt mir, dass ein Join mit der ID dieses Problem beheben würde, obwohl es keine Konsistenz gibt zwischen welchem Benutzer eine Freundschaftsanfrage gesendet und somit keine konsistente ID zu verbinden ... Ich bin mir nicht sicher, wie Sie beitreten sie richtig.
P.S. Ich bin mir sicher, dass es wahrscheinlich eine Möglichkeit gibt, die Beziehungen zu überprüfen, bei denen Sie der Absender oder der Empfänger sind, so dass jede Hilfe auch sehr geschätzt wird.
Sie müssen 'LEFT JOIN' verwenden, wenn Sie erhalten möchten' NULL' wenn Es gibt keine Übereinstimmung. – Barmar
@Barmar Wenn Sie dies als eine Lösung veröffentlichen möchten, gebe ich Ihnen die richtige Antwort. Danke für die Hilfe. – Kastoli
Es sieht so aus, als hättest du es selbst herausgefunden. Veröffentlichen Sie das als Antwort, nicht als Aktualisierung der Frage. – Barmar