SQL:如何获取表的列表对

时间:2018-12-01 08:39:53

标签: mysql sql select

要求:列出经常光顾同一酒吧的客户对(即列出所有可能在咖啡吧见面的客户对)

酒吧桌:

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

3 个答案:

答案 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

DBFiddle

答案 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 

数据库提琴手https://www.db-fiddle.com/f/npYnEgJAdH4yPa6NqBiqoT/1

答案 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