1

看看下面的 mySQL 查询:

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

上面的查询首先通过内部查询创建了一组 ALL the friends.sub's,然后外部查询选择了一个用户列表,其中用户 ID 包含在内部查询创建的集合中(即两个集合的并集) .

这很好用。但是,如果您需要内部集不仅包含 dom = 1 的 subs,还包含 sub = 1 的 dom,如下所示: 外部查询与上面相同,纯伪代码:

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

是否可以使用内部查询实现这种功能?

任何帮助或帮助表示赞赏;-D

非常感谢大家,我的头痛已经消失了!

4

2 回答 2

1

试试这个:

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)
于 2010-10-09T15:21:27.243 回答
1

我不确定我是否正确理解subdom表示什么,但看起来你可以UNION在其中使用 a :

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 
       );

测试用例:

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);

结果:

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

That said, @Alec's solution is probably more efficient.

于 2010-10-09T15:21:08.467 回答