查询 SQL:列出从未相互合作但与第三位艺术家共同合作的艺术家对

  • 本文关键字:艺术家 三位 SQL 查询 sql database musicbrainz
  • 更新时间 :
  • 英文 :


我有一个名为"特征"的表:

* 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的普通艺术家


相关内容

  • 没有找到相关文章

最新更新