SQL: как получить список пар таблиц - PullRequest
0 голосов
/ 01 декабря 2018

Требование: список пар клиентов, которые часто посещают один и тот же бар (т. Е. Список всех пар клиентов, которые могут встретиться в кафе)

Стол бара:

-------------------------
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 голосов
/ 01 декабря 2018

Я использую подзапрос, чтобы присоединиться к часто встречающимся с тем же баром, но с другим клиентом, а также использую «сортировку» идентификатора клиента с помощью>, чтобы избежать дублирования

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 

DB Fiddle : https://www.db -fiddle.com / f / npYnEgJAdH4yPa6NqBiqoT / 1

0 голосов
/ 01 декабря 2018

Чтобы получить все пары на один бар, вы можете получить это при самостоятельном присоединении к таблице Frequents.

Тогда вы можете просто присоединиться к другим таблицам по их идентификатору, чтобы получить имена.

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 здесь

0 голосов
/ 01 декабря 2018

Вы можете дважды присоединиться к гистограмме с частой таблицей, а затем продолжить присоединение, чтобы получить имя клиента.Чтобы предотвратить дублирование, вы можете принять произвольное решение, что один 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...