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!

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top