子查询 returns 多于 1 行,但我希望它
Subquery returns more than 1 row, but I want it to
我正在尝试运行查询我的音乐数据库。
我的数据库的相关部分如下所示:
CREATE TABLE ARTIST (
artistid integer(3) auto_increment not null,
name varchar(30) not null,
//other columns
CONSTRAINT ALBUM_pk PRIMARY KEY (artistid)
);
CREATE TABLE SONG (
songid integer(5) auto_increment not null,
lineupid integer(5) not null,
title varchar(50) not null,
//other columns
CONSTRAINT SONG_pk PRIMARY KEY (songid),
CONSTRAINT SONG_fk_ARTIST FOREIGN KEY (lineupid)
REFERENCES ARTISTLINEUPLINEUP (artistlineupid),
CONSTRAINT SONG_fk_GENRE FOREIGN KEY (genreid)
REFERENCES GENRE (genreid)
);
CREATE TABLE ARTISTLINEUP (
artistlineupid integer(3) auto_increment not null,
lineupid integer(5) not null,
artistid integer(3) not null,
CONSTRAINT ARTISTLINEUP_pk PRIMARY KEY (artistlineupid),
CONSTRAINT ARTISTLINEUP_fk_ARTIST FOREIGN KEY (artistid)
REFERENCES ARTIST (artistid),
CONSTRAINT ARTISTLINEUP_fk_LINEUP FOREIGN KEY (lineupid)
REFERENCES LINEUP (lineupid)
);
我正在尝试获取一位艺术家创作的所有歌曲,该艺术家有多个阵容。
SELECT title
FROM song
WHERE lineupid = (
SELECT artistlineupid
FROM artistlineup
WHERE artistid = (
SELECT artistid
FROM artist
WHERE name = "Black Sabbath"));
但是,它给了我以下错误:
#1242 - Subquery returns more than 1 row
这是正确的,因为这位艺术家有多个阵容,因此 return 有两个号码。为什么不能 return 包含两个 lineupid 的歌曲?我怎样才能让它工作?
谢谢
虽然您可以用不同的方式表达查询,但如果您想比较多个值,请使用 IN
而不是 =
:
SELECT title
FROM song
WHERE lineupid IN (
SELECT artistlineupid
FROM artistlineup
WHERE artistid IN (
SELECT artistid
FROM artist
WHERE name = "Black Sabbath"));
如果 artistid 相对于名称是唯一的,您还可以使用限制
SELECT title
FROM song
WHERE lineupid = (
SELECT artistlineupid
FROM artistlineup
WHERE artistid = (
SELECT artistid
FROM artist
WHERE name = "Black Sabbath" LIMIT 1));
写 'IN' 而不是在查询中给出 '=' 符号。
表示您使用了“=”运算符 2 次,其中 clause.so 将其替换为 'In',然后尝试查询。
你会得到结果。
谢谢,
帕尼古玛
我正在尝试运行查询我的音乐数据库。
我的数据库的相关部分如下所示:
CREATE TABLE ARTIST (
artistid integer(3) auto_increment not null,
name varchar(30) not null,
//other columns
CONSTRAINT ALBUM_pk PRIMARY KEY (artistid)
);
CREATE TABLE SONG (
songid integer(5) auto_increment not null,
lineupid integer(5) not null,
title varchar(50) not null,
//other columns
CONSTRAINT SONG_pk PRIMARY KEY (songid),
CONSTRAINT SONG_fk_ARTIST FOREIGN KEY (lineupid)
REFERENCES ARTISTLINEUPLINEUP (artistlineupid),
CONSTRAINT SONG_fk_GENRE FOREIGN KEY (genreid)
REFERENCES GENRE (genreid)
);
CREATE TABLE ARTISTLINEUP (
artistlineupid integer(3) auto_increment not null,
lineupid integer(5) not null,
artistid integer(3) not null,
CONSTRAINT ARTISTLINEUP_pk PRIMARY KEY (artistlineupid),
CONSTRAINT ARTISTLINEUP_fk_ARTIST FOREIGN KEY (artistid)
REFERENCES ARTIST (artistid),
CONSTRAINT ARTISTLINEUP_fk_LINEUP FOREIGN KEY (lineupid)
REFERENCES LINEUP (lineupid)
);
我正在尝试获取一位艺术家创作的所有歌曲,该艺术家有多个阵容。
SELECT title
FROM song
WHERE lineupid = (
SELECT artistlineupid
FROM artistlineup
WHERE artistid = (
SELECT artistid
FROM artist
WHERE name = "Black Sabbath"));
但是,它给了我以下错误:
#1242 - Subquery returns more than 1 row
这是正确的,因为这位艺术家有多个阵容,因此 return 有两个号码。为什么不能 return 包含两个 lineupid 的歌曲?我怎样才能让它工作?
谢谢
虽然您可以用不同的方式表达查询,但如果您想比较多个值,请使用 IN
而不是 =
:
SELECT title
FROM song
WHERE lineupid IN (
SELECT artistlineupid
FROM artistlineup
WHERE artistid IN (
SELECT artistid
FROM artist
WHERE name = "Black Sabbath"));
如果 artistid 相对于名称是唯一的,您还可以使用限制
SELECT title
FROM song
WHERE lineupid = (
SELECT artistlineupid
FROM artistlineup
WHERE artistid = (
SELECT artistid
FROM artist
WHERE name = "Black Sabbath" LIMIT 1));
写 'IN' 而不是在查询中给出 '=' 符号。
表示您使用了“=”运算符 2 次,其中 clause.so 将其替换为 'In',然后尝试查询。
你会得到结果。
谢谢,
帕尼古玛