子查询返回超过1行,但我想要它

时间:2015-06-05 10:21:32

标签: mysql sql subquery

我试图在我的音乐数据库上运行查询。

我的数据库的相关部分如下所示:

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

这是正确的,因为这位艺术家有多个阵容,因此返回两个数字。为什么不能同时使用lineupid&s?返回歌曲?我怎样才能让它发挥作用?

由于

3 个答案:

答案 0 :(得分:2)

虽然您可以用不同的方式表达查询,但如果您想比较多个值,请使用IN而不是=

SELECT title
FROM song
WHERE lineupid IN (
    SELECT artistlineupid
    FROM artistlineup
    WHERE artistid IN (
        SELECT artistid
        FROM artist
        WHERE name = "Black Sabbath"));

答案 1 :(得分:0)

如果artistid在名称方面是唯一的,您也可以使用限制

SELECT title
FROM song
WHERE lineupid = (
    SELECT artistlineupid
    FROM artistlineup
    WHERE artistid = (
        SELECT artistid
        FROM artist
        WHERE name = "Black Sabbath" LIMIT 1));

答案 2 :(得分:0)

写入“IN”而不是在查询中给出“=”符号。

表示你在where子句中使用'='运算符2次。用'In'替换它,然后尝试查询。

你会得到结果。

谢谢,

Phani kumar。