Non ho idea di come risolvere questo problema (sto lavorando su PostgreSQL):
ho una tabella (chiamata "featuring") in cui sono elencate le "featuring" tra alcuni cantanti:
('Shakira' , 'Rihanna'),
('Eminem' , 'Rihanna'),
('Sia' , 'Eminem'),
('SeanPaul' , 'Sia'),
('Queen' , 'DavidBowie'),
('LadyGaga' , 'Beyonce' ) ,
('LadyGaga' , 'Eminem');
Io devo elencare le coppie di artisti che non hanno mai collaborato tra loro ma hanno collaborato con un terzo artista. Questo è quello che ho fatto, e funziona:
-- tuple che hanno il 2° artista uguale
SELECT DISTINCT f1.artist_1, f2.artist_1
FROM featuring f1 join featuring f2 on (f1.artist_2 = f2.artist_2)
WHERE f1.artist_1 < f2.artist_1
and (f1.artist_1, f2.artist_1) not in
(
SELECT f3.artist_1, f3.artist_2
FROM featuring f3
WHERE f3.artist_1 < f3.artist_2
)
union
-- tuple che hanno il 1° artsita uguale
SELECT DISTINCT f1.artist_2, f2.artist_2
FROM featuring f1 join featuring f2 on (f1.artist_1 = f2.artist_1)
WHERE f1.artist_2 < f2.artist_2
and (f1.artist_2, f2.artist_2) not in
(
SELECT f3.artist_1, f3.artist_2
FROM featuring f3
WHERE f3.artist_1 < f3.artist_2
)
union
-- coppie di tuple che hanno l'artista uguale nella 1° col (1° tupla) e nella 2° (2° tupla)
SELECT DISTINCT f1.artist_2, f2.artist_1
FROM featuring f1 join featuring f2 on (f1.artist_1 = f2.artist_2)
WHERE f1.artist_2 < f2.artist_1
and (f1.artist_1, f2.artist_2) not in
(
SELECT f3.artist_1, f3.artist_2
FROM featuring f3
WHERE f3.artist_1 < f3.artist_2
)
union
-- coppie di tuple che hanno l'artista uguale nella 2° col (1° tupla) e nella 1° (2° tupla)
SELECT DISTINCT f1.artist_1, f2.artist_2
FROM featuring f1 join featuring f2 on (f1.artist_2 = f2.artist_1)
WHERE f1.artist_1 < f2.artist_2
and (f1.artist_1, f2.artist_2) not in
(
SELECT f3.artist_1, f3.artist_2
FROM featuring f3
WHERE f3.artist_1 < f3.artist_2
)
Ora però devo anche farlo in un altro modo; come posso fare?