MYSQL-通过连接表进行自我联接

时间:2018-11-14 22:38:11

标签: mysql

在作业上进行自我加入时遇到麻烦。自联接也从联接表rec_artist中拉出。这是我正在运行的代码,并返回一个空集。为什么我返回一个空集?

SELECT 
    a1.name, 
    a2.name, 
    ra.rec_id
FROM 
    artists a1, artists a2, rec_artist ra1, rec_artist ra2, rec_artist ra
WHERE 
    ra1.rec_id = ra2.rec_id
AND
    ra1.artist_id = a1.id
AND
    ra2.artist_id = a2.id
AND
    ra1.artist_id > ra2.artist_id;

表架构:

recordings
rec_title (varchar)
rec_id (Primary Key)
sales (dec)
genre_id (Foreign Key)

genres
id (primary key)
name (varchar)

artists
id (primary key)
name (varchar)

rec_artist (junction table)
artist_id (primary key) 
rec_id (primary key)

问题是:

列出至少有一个共同录音的艺术家对。

您的结果集必须包含3列:艺术家的姓名和他们在其中的record_id 常见(仅使用一条SQL语句)。

仅应显示唯一对。

不要将艺术家与他/她自己配对。

1 个答案:

答案 0 :(得分:1)

此查询不应返回空结果。它实际上应该返回巨大的结果。您正确地找到了有共同录音的几对艺术家,但是由于没有条件,每对将与每一个 rec_id复制在rec_artists表中在rec_artists ra子句的WHERE表中。

您不需要与rec_artists进行第三次联接。您只需从自联接的rec_id表中的任何一个中选择rec_artists列即可;自ra1.rec_id = ra2.rec_id起使用哪个都没关系。

正确的查询是:

SELECT a1.name, a2.name, ra1.rec_id
FROM artists a1, artists a2, rec_artist ra1, rec_artist ra2
WHERE ra1.rec_id = ra2.rec_id
AND ra1.artist_id = a1.id
AND ra2.artist_id = a2.id
AND ra1.artist_id > ra2.artist_id;

或使用ANSI JOIN语法:

SELECT a1.name, a2.name, ra1.rec_id
FROM rec_artist AS ra1
JOIN rec_artist AS ra2 ON ra1.rec_id = ra2.rec_id AND ra1.artist_id > ra2.artist_id
JOIN artists AS a1 ON ra1.artist_id = a1.id
JOIN artists AS a2 ON ra2.artist_id = a2.id

DEMO