查看以下mySQL查询:
SELECT fname,lname FROM users WHERE users.id IN (SELECT sub FROM friends WHERE friends.dom = 1 )
上面的查询首先通过内部查询创建一组ALL的friends.sub,然后外部查询选择一个用户列表,其中用户id包含在由内部查询创建的集合中(即,两套)。
这很好用。但是如果你需要内部集合不仅包含dom = 1的subs,而且还包含sub = 1的doms,如下所示: 外部查询保持与上面相同,纯伪代码:
(SELECT sub FROM friends WHERE friends.dom = 1 )
***AND***
(SELECT dom FROM friends WHERE friends.sub = 1 )
是否可以使用内部查询来实现这种功能?
任何帮助或帮助赞赏的人;-D
非常感谢你们,我的头痛现在已经消失了!
答案 0 :(得分: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)
答案 1 :(得分:1)
我不确定我是否正确理解了sub
和dom
所代表的内容,但看起来您可以在其中使用UNION
:
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)
尽管如此,@Alec's solution可能更有效率。