Hej.
Załóżmy, że mamy fikcyjną tabelę z listą 9 artystów:
Tabela artists
Teraz załóżmy, że artyści o artist_id 6, 7 i 8 tworzą muzykę w kolaboracji (tzn. mają wspólny zespół - oczywiście poniższe dane są zmyślone), dlatego łączy ich wspólny band_id o numerze 7:
Tabela artists_and_bands
Mysimy jeszcze rozpatrzyć sytuację, gdy jacyś artyści ukazują się pod różnymi aliasami (tzn. alternatywnymi nazwami), stąd artyści (kolumna artist_id) 6 i 7 mają wspólne alias_id równe 6, a analogicznie artyści 8 i 9 mają wspólny alias 7:
Tabela artists_and_aliases
No i chcemy wyświetlić listę skróconych nazw URL wszystkich artystów którzy w jakikolwiek sposób są powiązani z jednym konkretnym podanym artystą... Narazie zrobiłem coś takiego:
SELECT
`url`
FROM
`artists`
WHERE
`artist_id` IN (SELECT
`artist_id`
FROM
`artists_and_bands`
WHERE
`band_id` IN (SELECT
`band_id`
FROM
`artists_and_bands`
WHERE
`artist_id` IN (SELECT
`artist_id`
FROM
`artists_and_aliases`
WHERE
`alias_id` IN (SELECT
`alias_id`
FROM
`artists_and_aliases`
WHERE
`artist_id` = 8))))
No i rezultat jest w pełni prawidłowy (4 rekordy) - znalazło wszystkie nazwy url artystów na podstawie wejściowego WHERE `artist_id` = 8:
Jednak gdy zmienię ostatnią linię SQL na `artist_id` = 7 - otrzymuję coś innego (tylko 3 rekordy):
No i problem polega na tym, że fsol jest aliasem future-sound-of-london, który z kolei jest jednym z trzech współgrających muzyków, a jednak pomija go - dzieje się też tak w przypadku podania WHERE `artist_id` = 6 (a przy 9 już jest OK). Mniej więcej wiem nas czym polega problem, ale nie mam pojęcia jak go rozwiązać. Wiem, że to trudne ale za pomoc wynagrodzę.