Трехстороннее внутреннее соединение с дополнительным столом - PullRequest
0 голосов
/ 30 июня 2019

У меня есть музыкальная база данных со следующими таблицами:

Исполнители (ID, ArtistName)
Альбомы (ID, ArtistID, AlbumName)
Исполнители (ID, ArtistID, PerformerName)
AlbumPerformers (ID, AlbumID, певец, гитара, бас, ударные)

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

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

Это дает мне следующее, но вместо этого ставит идентификатор PerformerIDимени исполнителя:

    SELECT artists.Artist, albums.AlbumName, albumperformers.singer
    FROM artists
    INNER JOIN albums ON artists.artist_id=albums.artist_id
    INNER JOIN albumperformers ON albumperformers.album_id=albums.album_id;

Как я могу структурировать это так, чтобы оно давало мне имя исполнителя, а не ID?

Спасибо.

1 Ответ

1 голос
/ 30 июня 2019

Вам необходимо выполнить дополнительные СОЕДИНЕНИЯ, чтобы решить поля певца, баса, гитары и ударных, которые выглядят как FK для Performers.ID .

Я протестировал со следующими схемами таблиц:

CREATE TABLE Artists (ID INT, ArtistName VARCHAR(255));
CREATE TABLE Albums (ID INT, ArtistID INT, AlbumName VARCHAR(255));
CREATE TABLE Performers (ID INT, ArtistID INT, PerformerName VARCHAR(255));
CREATE TABLE AlbumPerformers (ID INT, AlbumID INT, singer INT, guitar INT, bass INT, drumer INT);

следующее утверждение:

SELECT 
Artists.ArtistName, 
Albums.AlbumName, 
PerformerSinger.PerformerName as Singer, 
PerformerDrumer.PerformerName as Drumer, 
PerformerGuitar.PerformerName as Guitar, 
PerformerBass.PerformerName as Bass 
FROM Artists 
INNER JOIN Albums ON Albums.ArtistID = Artists.ID 
INNER JOIN AlbumPerformers ON AlbumPerformers.AlbumID = Albums.ID 
INNER JOIN Performers AS PerformerSinger on AlbumPerformers.singer = PerformerSinger.ID 
INNER JOIN Performers AS PerformerDrumer on AlbumPerformers.drumer = PerformerDrumer.ID 
INNER JOIN Performers AS PerformerGuitar ON AlbumPerformers.guitar = PerformerGuitar.ID 
INNER JOIN Performers AS PerformerBass ON AlbumPerformers.bass = PerformerBass.ID;

Дает желаемый результат:

+------------+-----------+----------------+--------+-------------+-----------------+                                                                                         
| ArtistName | AlbumName | Singer         | Drumer | Guitar      | Bass            |                                                                                         
+------------+-----------+----------------+--------+-------------+-----------------+                                                                                         
| Beatles    | Revolver  | Paul McCartney | Ringo  | John Lennon | George Harrison |                                                                                         
+------------+-----------+----------------+--------+-------------+-----------------+   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...