2014-03-26 60 views
0

我正在使用MySQL中的db,並且需要來自一行中少數表的數據。這是相對於數據庫的連接問題:子查詢在MySQL過程中返回多於1行

CREATE TABLE pet (id INT, name VARCHAR(20)); 
insert into pet values (1,"Rufus"); 
insert into pet values (2,"Bali"); 
insert into pet values (3,"Lolo"); 

CREATE TABLE own (id INT, own_name VARCHAR(20), own_color VARCHAR(20)); 
insert into own values (1,"Me", "Red"); 
insert into own values (2,"Other owners" ,"Green"); 

CREATE TABLE pet_owner (id INT, id_pet INT, id_own INT); 
insert into pet_owner values (1, 1, 1); 
insert into pet_owner values (2, 2, 1); 
insert into pet_owner values (3, 3, 2); 

DROP procedure if exists `pet`; 
DELIMITER $$ 
CREATE procedure `pet`() 
BEGIN 
set @param = 1; 
select 
a.own_color as 'color', 
(select id_pet from pet_owner where id_own = @param) as 'pets' 

from own as a where a.id = @param; 
END$$ 

call pet; 

子查詢返回多個1行

如何收集所有的寵物ID的一排(每id_pet可以在其​​他列)

+0

我不清楚存儲的proc打算做什麼,或者您期望從其中的查詢輸出的格式。目前主要查詢和子查詢之間沒有關係 - 這是故意的嗎? –

回答

4

您要使用group_concat()

select o.own_color as color, 
     (select group_concat(id_pet) from pet_owner po where po.id_own = @param) as pets 
from own o 
where o.id = @param; 

請注意,我做了幾個更改查詢:

  • 表的別名是表名的縮寫,而不是無用的字母(o業主,而不是a)。
  • 列別名未被單引號包圍。只對字符串和日期常量使用單引號。如果您必須轉義標識符,請使用雙引號或反引號。
  • 增加了group_concat()
0

您可以使用GROUP_CONCAT

-- ... 
select 
a.own_color as 'color', 
(select group_concat(id_pet,',') from pet_owner where id_own = @param) as 'pets' 
from own as a where a.id = @param; 

但請注意結果有1024字節限制。要解決此問題,請在查詢之前運行此查詢:(根據您的需要更改2048)。

set group_concat_max_len=2048 
+0

以及你的答案與已經回答的答案有什麼不同? :) – NoobEditor

+0

我可能會回答遲到,但他是。另外我把內存限制提示 –

相關問題