2016-12-14 1 views
-1

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.

+1

Sie müssen 'LEFT JOIN' verwenden, wenn Sie erhalten möchten' NULL' wenn Es gibt keine Übereinstimmung. – Barmar

+0

@Barmar Wenn Sie dies als eine Lösung veröffentlichen möchten, gebe ich Ihnen die richtige Antwort. Danke für die Hilfe. – Kastoli

+0

Es sieht so aus, als hättest du es selbst herausgefunden. Veröffentlichen Sie das als Antwort, nicht als Aktualisierung der Frage. – Barmar

Antwort

0

Links verbinden zwischen einem Tisch aller Janes und einem Tisch von allen Freunden Johns.

Alle Janes:

**Query** 
SELECT user_table.id, user_table.first_name, user_table.last_name 
FROM user_table 
WHERE first_name LIKE 'jane%' 
OR last_name LIKE 'jane%' 
AND id != '1' 

**Results** 
+----+------------+-----------+ 
| id | first_name | last_name | 
+----+------------+-----------+ 
| 2 | Jane  | One  | 
| 3 | Jane  | Two  | 
| 4 | Jane  | Three  | 
+----+------------+-----------+ 

John Freunde:

**Query** 
(
    SELECT relationship_table.sender_id AS id, relationship 
    FROM relationship_table 
    WHERE receiver_id = '1' 
) 
UNION 
(
    SELECT relationship_table.receiver_id AS id, relationship 
    FROM relationship_table 
    WHERE sender_id = '1' 
) 

**Results** 
+----+--------------+ 
| id | relationship | 
+----+--------------+ 
| 2 | friends  | 
| 3 | pending  | 
+----+--------------+ 

Dann kombiniert:

**Query** 
SELECT searched_users.id, searched_users.first_name, searched_users.last_name, IFNULL(users_friends.relationship, 'not friends') AS relationship 
FROM (
    SELECT user_table.id, user_table.first_name, user_table.last_name 
    FROM user_table 
    WHERE first_name LIKE 'jane%' 
    OR last_name LIKE 'jane%' 
    AND id != '1' 
)searched_users 
LEFT JOIN (
    (
     SELECT relationship_table.sender_id AS id, relationship 
     FROM relationship_table 
     WHERE receiver_id = '1' 
    ) 
    UNION 
    (
     SELECT relationship_table.receiver_id AS id, relationship 
     FROM relationship_table 
     WHERE sender_id = '1' 
    ) 
)users_friends 
ON searched_users.id = users_friends.id 

**Results** 
+----+------------+-----------+--------------+ 
| id | first_name | last_name | relationship | 
+----+------------+-----------+--------------+ 
| 2 | Jane  | One  | friends  | 
| 3 | Jane  | Two  | pending  | 
| 4 | Jane  | Three  | not friends | 
+----+------------+-----------+--------------+ 
Verwandte Themen