要求:列出经常光顾同一酒吧的客户对(即列出所有可能在咖啡吧见面的客户对)
酒吧桌:
-------------------------
id| name
-------------------------
1 | Vivamus nibh
2 | odio tristique
3 | vulputate ullamcorper
4 | Cras lorem
5 | libero est,
客户表:
-----------------------
id| name
-----------------------
1 | Warren
2 | Olympia
3 | Logan
4 | Summer
5 | Kamal
6 | Fernandez
频率表:
-----------------
cust_id | bar_id
-----------------
1 | 1
2 | 1
3 | 2
4 | 2
5 | 3
6 | 4
预期输出:
---------------------------------------
customer1 | customer2 | barname
---------------------------------------
Warren | Olympia | Vivamus nibh
Logan | Summer | odio tristique
这是我的尝试,但是没有用:
select c1.name, c2.name, b1.name, b2.name
from frequents f1, frequents f2
join bar b1 on f1.bar_id = b1.id
join bar b2 on f2.bar_id = b2.id
join customer c1 on f1.cust_id = c1.id
join customer c2 on f2.cust_id = c2.id
where f1.bar_id = f2.bar_id;
答案 0 :(得分:3)
您可以将Bar表与频繁表连接两次,然后继续连接以获取客户名称。为了防止重复,您可以任意决定一个cust_id
应该小于另一个:
SELECT b.name, c1.name, c2.name
FROM bar b
JOIN frequents f1 ON f1.bar_id = b.id
JOIN frequents f2 ON f2.bar_id = b.id AND f1.cust_id < f2.cust_id
JOIN customer c1 ON c1.id = f1.cust_id
JOIN customer c2 ON c2.id = f2.cust_id
答案 1 :(得分:1)
我正在使用子查询来加入具有相同酒吧但不同客户的常客,并通过使用>避免重复来利用客户ID的“排序”
SELECT c1.name customer1, f2.name customer2, b.name barname
FROM frequents f
JOIN customer c1 ON c1.id = f.cust_id
JOIN bar b ON f.bar_id = b.id
JOIN (SELECT cust_id, bar_id, name
FROM frequents
JOIN customer ON id = cust_id) AS f2 ON f2.bar_id = f.bar_id AND f2.cust_id > f.cust_id
答案 2 :(得分:0)
要获得每个小节的所有对,自联接Frequents表可以使您满意。
然后,您只需在其ID上连接其他表即可获得名称。
SELECT
cust1.name AS customer1,
cust2.name AS customer2,
bar.name AS barname
FROM frequents freq1
JOIN frequents freq2 ON (freq2.bar_id = freq1.bar_id AND freq2.cust_id > freq1.cust_id)
JOIN bar ON bar.id = freq1.bar_id
LEFT JOIN customer cust1 ON cust1.id = freq1.cust_id
LEFT JOIN customer cust2 ON cust2.id = freq2.cust_id
ORDER BY freq1.cust_id, freq2.cust_id, freq1.bar_id;
SqlFiddle测试 here