我有一个名为"特征"的表:
* 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 壮举 Y,Z壮举 Y ---> (X, Z) 是解决方案
结果将是:
* Artist_1, Artist_2 *
Shakira Eminem
Eminem SeanPaul
Beyonce Eminem
LadyGaga Rihanna
Sia Rihanna
Sia LadyGaga
我该如何解决?谢谢!
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
按名称排序以删除重复项。
也许我以这种方式解决了,但我不确定,因为数据库的数据太多了:
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的普通艺术家