GOOGLE ADS

воскресенье, 1 мая 2022 г.

Использование SQL для соединения таблиц с соединительной таблицей

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

Table 1: musician
Columns: musicianID, surname, fName
Table 2: musician_band
Columns: musicianID, bandID
Table 3: band
Columns: bandID, bandName, genre, yearFormed, origin

Просто для начала я хочу вывести:

fName, bandName

Я попытался использовать этот запрос:

SELECT DISTINCT fName, bandName
FROM musician_band
JOIN musician ON musician.musicianID = musician_band.musicianID
JOIN band ON band.bandID = band.bandID

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

fname bandName
musician1 band1
musician1 band2
musician1 band3
musician2 band1
musician2 band2
musician2 band3

и т.д...

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


Решение проблемы

Проблема с вашими псевдонимами. Вам нужен отдельный псевдоним для каждой таблицы, на которую ссылаются, в вашем JOIN:

Этот пример запроса будет работать нормально:

SELECT DISTINCT fName, bandName
FROM @musician_band mb
JOIN @musician m ON m.musicianID = mb.musicianID
JOIN @band b ON mb.bandID = b.bandID

Используя этот пример в SQL Server:

declare @musician table(musicianID int, surname varchar(50), fName varchar(50));
insert into @musician(musicianID, surname, fName
) values
( 1, 'Pete Doherty', 'Pete Doherty')
, ( 2, 'Damon Albarn', 'Damon Albarn')
declare @musician_band table(musicianID int, bandID int);
insert into @musician_band(musicianID, bandID) values
(1, 1)
, (1, 2)
, (2, 3)
, (2, 4)
declare @band table(bandID int, bandName varchar(50), genre varchar(50), yearFormed int, origin varchar(50));
insert into @band(bandID, bandName, genre, yearFormed, origin
) values
( 1, 'The Libertines', '', 0, '')
, (2, 'Babyshambles', '', 0, '')
, (3, 'Blur', '', 0, '')
, (4, 'Gorillaz', '', 0, '')

Результат:

fName bandName
Damon Albarn Blur
Damon Albarn Gorillaz
Pete Doherty Babyshambles
Pete Doherty The Libertines

Просто замените @tablename своей собственной таблицей. DISTINCTПолезна в этом случае?

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...