查询SQL:列出从未与彼此合作但与第三位艺术家合作的艺术家对

时间:2017-07-15 13:08:30

标签: sql database musicbrainz

我有这个名为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

我怎么解决?非常感谢你!

2 个答案:

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