请考虑以下内容......本示例假设通过每个友谊插入两行来确定往复。然而,为了简单起见,下面的例子并没有检查友谊是否有回报!
DROP TABLE IF EXISTS friends;
CREATE TABLE friends
(initiator VARCHAR(12) NOT NULL
,reciprocator VARCHAR(12) NOT NULL
,PRIMARY KEY (initiator,reciprocator)
);
INSERT INTO friends VALUES
('Adam','Ed'),
('Ed','Adam'),
('Adam','Ben'),
('Ben','Adam'),
('Adam','Charlie'),
('Charlie','Adam'),
('Adam','Dan'),
('Dan','Adam'),
('Ed','Ben'),
('Ben','Ed'),
('Ben','Charlie'),
('Charlie','Ben'),
('Charlie','Dan'),
('Dan','Charlie'),
('Dan','Fred'),
('Fred','Dan'),
('Adam','Fred'),
('Fred','Adam');
要获得所有奔的“的朋友 - 的 - 朋友”,我们可以做到这一点的列表...
SELECT y.reciprocator
FROM friends x
JOIN friends y
ON y.initiator = x.reciprocator
AND y.reciprocator <> x.initiator
LEFT
JOIN friends z
ON z.reciprocator = y.reciprocator
AND z.initiator = x.initiator
WHERE x.initiator = 'Ben'
AND z.initiator IS NULL;
+--------------+
| reciprocator |
+--------------+
| Dan |
| Fred |
| Dan |
+--------------+
正如你所看到的,因为丹是朋友亚当和查理(本的朋友)他的名字出现了两次。
因此,要获得DISTINCT朋友朋友列表,只需包含DISTINCT运算符。
同样,获得个人谁是陌生人本名单,但至少两个本的朋友的朋友,我们可以做到这一点...
SELECT y.reciprocator
FROM friends x
LEFT
JOIN friends y
ON y.initiator = x.reciprocator
AND y.reciprocator <> x.initiator
LEFT
JOIN friends z
ON z.reciprocator = y.reciprocator
AND z.initiator = x.initiator
WHERE x.initiator = 'Ben'
AND z.initiator IS NULL
GROUP
BY y.reciprocator
HAVING COUNT(*) >= 2;
+--------------+
| reciprocator |
+--------------+
| Dan |
+--------------+
可能有处理的几种方法这个问题的相互作用方面,正如处理互惠本身的几种方式一样。
一种方法是用一个简单的子查询替换上述每个出现的friends
表,
SELECT y.reciprocator
FROM (SELECT a.* FROM friends a JOIN friends b ON b.reciprocator = a.initiator AND b.initiator = a.reciprocator) x
LEFT
JOIN (SELECT a.* FROM friends a JOIN friends b ON b.reciprocator = a.initiator AND b.initiator = a.reciprocator) y
ON y.initiator = x.reciprocator
AND y.reciprocator <> x.initiator
LEFT
JOIN (SELECT a.* FROM friends a JOIN friends b ON b.reciprocator = a.initiator AND b.initiator = a.reciprocator) z
ON z.reciprocator = y.reciprocator
AND z.initiator = x.initiator
WHERE x.initiator = 'Ben'
AND z.initiator IS NULL
GROUP
BY y.reciprocator
HAVING COUNT(*) >= 2;
不需要使用MySQL。你如何对待互惠? – Strawberry
Whell ..我不...任何建议如何我可以修改这个查询来检查,如果我也是我的朋友的朋友? – PsychoX