Frage

Werfen Sie einen Blick auf die folgende mySQL Abfrage:

SELECT fname,lname FROM users WHERE users.id IN (SELECT sub FROM friends WHERE friends.dom = 1 )

Die obige Abfrage erstellt zunächst ein Satz aller friends.sub über die innere Abfrage ist, und dann die äußere Abfrage wählt eine Liste der Benutzer in dem Benutzer-IDs innerhalb des Satzes von der inneren Abfrage (dh die Vereinigung der erstellt enthalten sind zwei Sätze).

Und das funktioniert gut. Aber wenn man den inneren Satz benötigt enthält nicht nur die U-Boote, wo dom = 1, sondern auch der dom wo sub = 1, etwa so: Äußerte Abfrage bleibt gleich wie oben, reiner Pseudo-Code:

(SELECT sub FROM friends WHERE friends.dom = 1 )
***AND***
(SELECT dom FROM friends WHERE friends.sub = 1 )

Ist es möglich, diese Art von Funktionalität mit der inneren Abfrage ??

zu machen

Jede Hilfe oder Unterstützung geschätzt Jungs ;-D

Vielen Dank Jungs, meine Kopfschmerzen ist jetzt weg!

War es hilfreich?

Lösung

Versuchen Sie diese:

SELECT u.fname, u.lname
FROM users u
INNER JOIN friends f
  ON (u.id = f.sub AND f.dom = 1)
  OR (u.id = f.dom AND f.sub = 1)

Andere Tipps

Ich bin mir nicht sicher, ob ich das richtig verstehen, was sub und dom darstellen, aber es sieht aus wie Sie ein UNION dort verwenden können:

SELECT fname, lname 
FROM   users 
WHERE  users.id IN 
       (  
          SELECT sub FROM friends WHERE friends.dom = 1 
          UNION
          SELECT dom FROM friends WHERE friends.sub = 1 
       );

Testfall:

CREATE TABLE users (id int, fname varchar(10), lname varchar(10));
CREATE TABLE friends (dom int, sub int);

INSERT INTO users VALUES (1, 'Bob', 'Smith');
INSERT INTO users VALUES (2, 'Peter', 'Brown');
INSERT INTO users VALUES (3, 'Jack', 'Green');
INSERT INTO users VALUES (4, 'Kevin', 'Jackson');
INSERT INTO users VALUES (5, 'Steven', 'Black');

INSERT INTO friends VALUES (1, 2);
INSERT INTO friends VALUES (1, 3);
INSERT INTO friends VALUES (4, 1);
INSERT INTO friends VALUES (3, 4);
INSERT INTO friends VALUES (5, 2);

Ergebnis:

+-------+---------+
| fname | lname   |
+-------+---------+
| Peter | Brown   |
| Jack  | Green   |
| Kevin | Jackson |
+-------+---------+
3 rows in set (0.00 sec)

Wie gesagt, @ Alecs Lösung ist wahrscheinlich effizienter zu gestalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top