子查询返回超过1行?

时间:2013-03-06 03:32:51

标签: mysql sql

我有艺术家表和artists_alias表。 artists_alias包含艺术家的所有可能名称。

我的查询,抓取多位艺术家的艺术家数据,如下所示:

$sql = "SELECT artist.artist_id, artist.artist_name
        FROM artists artist
        WHERE artist.artist_id IN (3,9,500);";

现在,我想要包含任何已知的别名,可以是1或X.我可以在上面的查询中获取此信息吗?或者这是一个单独的查询?

我正在考虑做类似的事情:

$sql = "SELECT artist.artist_id, artist.artist_name, 
       (SELECT * FROM artists_alias WHERE [???])....";

但是我收到错误消息" Subquery返回超过1行" - 我是否比这更复杂?这可以是一个查询吗?

我很乐意将别名逗号分开,所以例如返回行可能看起来像:3," ben折叠5"," ben折叠5,benfolds, ben折五,折五"

3 个答案:

答案 0 :(得分:4)

您需要LEFT JOINartist_alias才能检索这些内容。如果您希望以逗号分隔,请使用汇总GROUP_CONCAT()

使用LEFT JOIN以便即使艺术家没有关联别名也会返回一行。

每个别名一行(每行重复艺术家信息):

SELECT
  artist.artist_id, 
  artist.artist_name,
  /* Retrieves all cols from artists_alias. SELECT only what you need... */
  artists_alias.*
FROM
  artist
  /* Assuming there's an artists_alias.artist_id. Substitute the correct column name */
  LEFT JOIN artists_alias ON artist.artist_id = artists_alias.artist_id
WHERE artist.artist_id IN (3, 9, 500)

或通过GROUP_CONCAT()以逗号分隔的别名列表:

SELECT
  artist.artist_id, 
  artist.artist_name,
  /* Substitute the correct column name for the actual alias */
  GROUP_CONCAT(artists_alias.alias) AS all_aliases
FROM
  artist
  LEFT JOIN artists_alias ON artist.artist_id = artists_alias.artist_id
WHERE artist.artist_id IN (3, 9, 500)
GROUP BY 
  artist.artist_id,
  artist.artist_name

答案 1 :(得分:2)

如果要返回一行中的所有别名,请使用group_concat()

SELECT a.artist_id, a.artist_name,
       group_concat(aa.alias) as aliases
FROM artists artist left outer join
     artists_alias aa
     on a.artist_id = aa.artist_id
WHERE at.artist_id IN (3,9,500)
group by a.artist_id, a.artist_name

答案 2 :(得分:-1)

将限制1放在最后。

从tble中选择*,其中a = 1限制1;