我有这个名为FEATURING的表:
* Artist_1, join_phrase, Artist_2 *
Shakira feat. Rihanna
Eminem feat. Rihanna
Sia feat. Eminem
SeanPaul feat. Sia
Queen feat. DavidBowie
LadyGaga feat. Beyonce
LadyGaga feat. Eminem
我需要指定一个SQL查询,其中包含从不与之合作的艺术家的对( Artist_1的名称, Artist_2的名称)彼此但与另一位艺术家共同合作
例如:X feat Y,Z feat Y ---> (X,Z)是解决方案
结果将是:
* Artist_1, Artist_2 *
Shakira Eminem
Eminem SeanPaul
Beyonce Eminem
LadyGaga Rihanna
Sia Rihanna
Sia LadyGaga
我怎么解决?非常感谢你!
答案 0 :(得分:0)
http://sqlfiddle.com/#!6/5ee966/1
Select
Case When t1.Artist_1 < t2.Artist_1 Then t1.Artist_1 Else t2.Artist_1 End Artist_1,
Case When t1.Artist_1 < t2.Artist_1 Then t2.Artist_1 Else t1.Artist_1 End Artist_2
From FEATURING t1 Join FEATURING t2 On t1.Artist_2 = t2.Artist_2 and t1.Artist_1 <> t2.Artist_1
Union
Select
Case When t1.Artist_1 < t2.Artist_2 Then t1.Artist_1 Else t2.Artist_2 End Artist_1,
Case When t1.Artist_1 < t2.Artist_2 Then t2.Artist_2 Else t1.Artist_1 End Artist_2
From FEATURING t1 Join FEATURING t2 On t1.Artist_2 = t2.Artist_1
Union
Select
Case When t1.Artist_2 < t2.Artist_2 Then t1.Artist_2 Else t2.Artist_2 End Artist_1,
Case When t1.Artist_2 < t2.Artist_2 Then t2.Artist_2 Else t1.Artist_2 End Artist_2
From FEATURING t1 Join FEATURING t2 On t1.Artist_1 = t2.Artist_1 and t1.Artist_2 <> t2.Artist_2
按名称排序以删除重复项。
答案 1 :(得分:0)
也许我以这种方式解决了,但我不确定,因为数据库的数据太多了:
SELECT DISTINCT f1.artist_1, f2.artist_1
FROM featuring f1 join featuring f2 on (f1.artist_2 = f2.artist_2)
WHERE f1.art1 < f2.art1
and (f1.artist_1, f2.artist_1) not in (SELECT f3.art1, f3.art2
FROM featuring f3
WHERE f3.artist_1 < f3.artist_2
)
order by f1.art1
嵌套的SELECT表示Artist_1与Artist_2不同的艺术家的协作。
主要的SELECT从F1获取Artist_1,从F2获取Artist_1。
F1和F2已加入Artist_1和Artist_2的普通艺术家