带连接表的自连接

uwopmtnx  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(236)

在家庭作业中做自我连接有困难。自连接也是从连接表rec\u中提取的。这是我正在运行的代码,返回一个空集。为什么我要退货?

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列:艺术家的姓名和他们共同的录制id(仅使用一条sql语句)。
 只应显示唯一对。
 不要把艺术家与自己配对。

vd2z7a6w

vd2z7a6w1#

此查询不应返回空结果。它实际上应该会带来巨大的结果。您正确地找到了具有共同录音的艺术家对,但是每个艺术家对都将在每个 rec_idrec_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联接语法:

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

演示

相关问题