MySQL jointure réflexive question
Question
Jetez un oeil à la requête de mySQL suivante:
SELECT fname,lname FROM users WHERE users.id IN (SELECT sub FROM friends WHERE friends.dom = 1 )
La requête ci-dessus crée d'abord un ensemble de tous les friends.sub est par la requête interne, puis la requête externe sélectionne une liste d'utilisateurs où ids utilisateurs sont contenus dans l'ensemble créé par la requête interne (à savoir l'union du deux ensembles).
Et ce beau des travaux. Mais si vous avez besoin de l'ensemble intérieur pour contenir non seulement les sous-marins où dom = 1, mais aussi les Doms où sub = 1, comme suit: requête externe reste comme ci-dessus, pur pseudocode:
(SELECT sub FROM friends WHERE friends.dom = 1 )
***AND***
(SELECT dom FROM friends WHERE friends.sub = 1 )
Est-il possible de faire ce genre de fonctionnalité avec la requête interne ??
Toute aide ou assistance apprécié les gars ;-D
Merci un gars de beaucoup, mon mal de tête a disparu maintenant!
La solution
Essayez ceci:
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)
Autres conseils
Je ne sais pas si je comprends bien ce que sub
et dom
représentent, mais il semble que vous pouvez utiliser un UNION
là-dedans:
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
);
Cas de test:
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);
Résultat:
+-------+---------+
| fname | lname |
+-------+---------+
| Peter | Brown |
| Jack | Green |
| Kevin | Jackson |
+-------+---------+
3 rows in set (0.00 sec)
Cela dit, @ solution d'Alec est probablement plus efficace.