2013-03-06 187 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