Соединение SQL для нескольких столбцов с идентификаторами

У меня есть две таблицы SQL. В первой таблице хранится список спортсменов с их идентификаторами и именами. Например:

athlete_id | first_name | last_name
-----------|------------|----------
1          | Matthew    | Reese
2          | Tiffanie   | Renz
3          | Tom        | Dow

так далее...

Во второй таблице хранятся записи для соревнований по треку (спринту) и идентификатор спортсмена, соревнующегося на каждой дорожке. Например:

event_id | lane1_athlete_id | lane2_athlete_id | lane3_athlete_id  
---------|------------------|------------------|-----------------
1        | 1                | 15               | 24
2        | 18               | 2                | 4
3        | 78               | 50               | 3

так далее...

Мне нужно создать SQL-запрос, который вернет эту вторую таблицу, но с идентификаторами спортсменов, разрешенными в имена спортсменов. Например:

event_id | lane1_athlete | lane2_athlete | lane3_athlete  
---------|---------------|---------------|--------------
1        | Matthew Reese | Lesa Allain   | Nicole Spiers
2        | Emmy Bartol   | Tiffanie Renz | Louise Baier
3        | Zack Bui      | Norah Flagg   | Tom Dow

Я предполагаю, что это связано с объединением таблиц, но я не могу понять правильный запрос. Любая помощь будет оценена по достоинству.

Хотя у вас есть хорошее решение, приведенное ниже, я мог бы предложить изменить вашу базу данных так, чтобы в ней было 3 таблицы вместо 2 - спортсмены, события и спортсмены (возможно, таблица 1-многие, содержащая столбец laneid). Таким образом, вам не нужно добавлять новые столбцы каждый раз, когда вводится новая полоса. Решение вашего вопроса будет другим, но я считаю, что это будет более нормализованный подход.

sgeddes 08.09.2018 05:36
Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
1
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Соедините вторую таблицу с первой трижды:

SELECT
    e.event_id,
    CONCAT(a1.first_name, ' ', a1.last_name) AS lane1_athlete,
    CONCAT(a2.first_name, ' ', a2.last_name) AS lane2_athlete,
    CONCAT(a3.first_name, ' ', a3.last_name) AS lane3_athlete
FROM events e
LEFT JOIN athletes a1
    ON e.lane1_athlete_id = a1.athlete_id
LEFT JOIN athletes a2
    ON e.lane2_athlete_id = a2.athlete_id
LEFT JOIN athletes a3
    ON e.lane3_athlete_id = a3.athlete_id;

левые внешние соединения в этой ситуации более безопасны, чем внутренние, поскольку неверный идентификатор спортсмена приведет к исчезновению ваших строк с внутренним соединением.

Chris Reynolds 08.09.2018 05:32

@ChrisReynolds На самом деле, если таблицы спроектированы правильно, с внешними и первичными ключами, тогда не должно быть возможности даже сослаться на спортсмена в таблице событий, которой не существует. Но чтобы признать вашу точку зрения, я добавил левые соединения.

Tim Biegeleisen 08.09.2018 05:35

Огромное спасибо! Я не был уверен, понадобится ли повторение соединений, но, похоже, это так.

Skoota 08.09.2018 06:07

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