Получение данных из таблиц через JOINS

У меня есть три таблицы: 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, но не смог заставить их работать.

Любая помощь с запросом или ссылками будет полезна.

Спасибо!

Пожалуйста, прекратите использовать неявные соединения на основе запятых и используйте Явный синтаксис на основе Join

Madhur Bhaiya 25.10.2018 21:58

Ваш текущий запрос выполняет INNER JOIN, неявный старый стиль.

jarlh 25.10.2018 21:59
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
49
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий
  • Вам следует избегать использования неявных объединений на основе запятых и использовать Явный синтаксис на основе 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 25.10.2018 22:14

@softvar рад помочь; и прекратите использовать соединения на основе запятых :)

Madhur Bhaiya 25.10.2018 22:14

Конечно, позаботимся в следующий раз. Прочтите об этом подробнее.

softvar 25.10.2018 22:18
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

;

Другие вопросы по теме