首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL -自连接与连接表

问MYSQL -自连接与连接表
EN

Stack Overflow用户
提问于 2018-11-14 22:38:10
回答 1查看 77关注 0票数 0

在做家庭作业时遇到困难。自连接也是从连接表rec_artist中提取的.这是我正在运行的代码,并返回一个空集。为什么我要归还一套空的?

代码语言:javascript
复制
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;

表模式:

代码语言:javascript
复制
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列:艺术家的名字和他们共同的recording_id (只使用一条语句)。

只应显示唯一的对。

不会把艺术家和他/她自己配对。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-14 22:59:19

此查询不应返回空结果。它实际上应该会返回一个巨大的结果。您正确地找到了具有共同记录的艺术家对,但每对都将与rec_artists表中的每个rec_artists复制,因为在WHERE子句中对rec_artists ra表没有任何条件。

您不需要第三次加入rec_artists。您可以简单地从自联接中的任何一个rec_id表中选择rec_artists列;使用哪一种并不重要,因为ra1.rec_id = ra2.rec_id。

正确的查询是:

代码语言:javascript
复制
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连接语法:

代码语言:javascript
复制
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

演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53309778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档