2013-03-06 147 views
1

我有一个艺术家表和一个artists_alias表。 artists_alias包含艺术家的所有可能的名字。子查询返回多于1行?

我的查询,抢在多个关注的艺术家,是这样的:

$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 [???])...."; 

,但我得到错误信息“子查询返回多个1行” - 我在使这个复杂得多,它是什么?这可以是一个查询吗?

我很高兴有逗号分隔的别名,所以例如一回行可能看起来像:3,“本折叠五”,“本折叠五,benfolds,本折叠五,折五”

回答

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 
+0

啊,这是伟大的!非常感谢你!出于某种原因,我认为LEFT JOIN不会获取所有值。耸肩。 – Mike 2013-03-06 03:46:51

-1

出台限价1到底。

select * from tble where a = 1 limit 1;

+0

这实际上并没有解决问题,它只是掩盖了症状。 – 2013-03-06 03:40:10

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 
+0

谢谢!非常感激! – Mike 2013-03-06 03:48:43