У меня есть три таблицы: sessions
, urls
и visitors
.
Мне нужно объединить эти три таблицы таким образом, чтобы я мог получать данные из каждой таблицы, а максимальное количество возвращаемых строк должно быть равно сеансам.
Ниже приводится основная схема моих таблиц.
Стол sessions
session_id | url_id | referrer_id | country
-------------------------------------------
1234 | a1b1 | bb11 | US
4567 | x1y1 | ll33 | IN
6789 | a1b1 | ff99 | UK
Стол urls
id | url |
-----------------------------------------
a1b1 | https://url-1.com |
x1y1 | https://url-2.com |
bb11 | https://referrer-url-1.com |
ll33 | https://referrer-url-2.com |
ff99 | https://referrer-url-3.com |
Стол visitors
id | session_id | visiting_time |
-----------------------------------------
1 | 1234 | 447383930 |
2 | 4567 | 547383930 |
3 | 6789 | 647383930 |
Что я хочу как окончательный результат должен выглядеть как:
session_id | visiting_time | url | referrer_url | country
------------------------------------------------------------------------------------------
1234 | 447383930 | https://url-1.com | https://referrer-url-1.com | US |
4567 | 547383930 | https://url-2.com | https://referrer-url-2.com | IN |
6789 | 647383930 | https://url-1.com | https://referrer-url-3.com | UK |
Я хочу сопоставить url_id
в таблице sessions
с id
в таблице urls
и получить соответствующий url
из таблицы urls
и получить значение в новом столбце с именем url
. Точно так же сопоставьте referrer_id
в таблице sessions
с id
в таблице urls
и получите соответствующий url
из таблицы urls
и получите значение в новом столбце с именем referring_url
.
Как видите: JOINS с sessions
и visitors
прост и может быть просто выполнен с помощью:
select session_id, visiting_time, country
from sessions,
visitors
where sessions.session_id = visitors.session_id;
Но присоединиться к таблице urls
и получить url
и referring_url
несколько сложно. Я пробовал LEFT JOIN
и INNER JOIN
, но не смог заставить их работать.
Любая помощь с запросом или ссылками будет полезна.
Спасибо!
Ваш текущий запрос выполняет INNER JOIN, неявный старый стиль.
Join
urls
; один для получения url
и другой для referrer_url
.Попробуйте следующее:
SELECT s.session_id,
v.visiting_time,
u1.url,
u2.url AS referrer_url,
s.country
FROM sessions AS s
JOIN visitors AS v ON v.session_id = s.session_id
JOIN urls AS u1 ON u1.id = s.url_id
JOIN urls AS u2 ON u2.id = s.referrer_id
Все остальные ответы также действительны, но этот ответ сработал отлично, и сначала был дан ответ. Спасибо Мадхур Бхайя за помощь :)
@softvar рад помочь; и прекратите использовать соединения на основе запятых :)
Конечно, позаботимся в следующий раз. Прочтите об этом подробнее.
select sessions.session_id, visitors.visiting_time, urls.url, urlsReferrer.url referrer_url, sessions.country
from sessions
inner join visitors on sessions.session_id = visitors.session_id
inner join urls on sessions.url_id = url.id
left join urls urlsReferrer on sessions.referrer_id = urlsReferrer.id
Вы должны использовать соединение для URL-адресов дважды: для url_id и для referrer_id
select session_id
, visiting_time
, u1.url
, u2.url
, country
from sessions
INNER JOIN visitors ON sessions.session_id = visitors.session_id
INNER JOIN urls u1 on u1.id= sessions.url_id
INNER JOIN urls u2 on u2.id= sessions.referrer_id
Таким образом, вы можете присоединиться к сеансам для получения обоих значений, которые вам нужны.
Соединения определены в операторе from - прочтите https://www.w3schools.com/sql/default.asp, чтобы лучше понять использование соединения.
При необходимости измените запрос в зависимости от того, из какой таблицы "referrer_url" на самом деле происходит
Предупреждение: Вы должны включить оператор where, который ограничивает ваш результат. Я настоятельно рекомендую определить поле даты и диапазон, чтобы вы не запускали длительный запрос и не влияли на производительность базы данных.
select
s.session_id,
v.visiting_time,
s.country,
u.url,
u.referrer_url
from
sessions s
join visitors v on session_id
join urls on u.id=s.url_id
;
Пожалуйста, прекратите использовать неявные соединения на основе запятых и используйте Явный синтаксис на основе
Join