MySQL selbst beitreten Frage
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 machenJede Hilfe oder Unterstützung geschätzt Jungs ;-D
Vielen Dank Jungs, meine Kopfschmerzen ist jetzt weg!
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.