2014-03-26 6 views
0

저는 MySQL에서 db를 작업 중이며 한 행의 소수 테이블에서 데이터를 필요로합니다. 그것은 상대 데이터베이스와 연결 문제입니다 :서브 쿼리는 MySQL 프로 시저에서 두 개 이상의 행을 반환합니다.

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_pet 다른 컬럼에있을 수 있습니다)

+0

저장 프로 시저가 의도 한 것이 무엇인지, 또는 그 안에있는 쿼리의 예상 출력 형식은 확실하지 않습니다. 현재 주 쿼리와 부질의 사이에는 상관 관계가 없습니다 - 의도적입니까? –

답변

4

한 행에있는 모든 애완 동물의 id를 수집하는 방법 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; 

나는 쿼리에 대한 변경의 몇 가지를 만들어 :

  • 테이블 별칭 (대신 a의 소유자 o) 테이블 이름에 대한 약어 대신 쓸모없는 문자입니다.
  • 열 별칭은 작은 따옴표로 묶지 않습니다. 문자열 및 날짜 상수에는 작은 따옴표 만 사용하십시오. 식별자를 이스케이프해야하는 경우 큰 따옴표 또는 역 따옴표를 사용하십시오. 당신은 GROUP_CONCAT을 사용할 수 있습니다
  • group_concat()
0

을 추가했습니다.

-- ... 
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

나는 늦게 대답 할지도 모르지만 그는 있었다. 또한 메모리 제한 팁을 넣습니다. –

관련 문제