2010-08-18 1 views
1

나는 연말 연시에 장난감과 음식을 제공하는 지역 비영리 단체를 위해 자원한다. 내가 그들을 돕고있는 한 가지 방법은 선물/음식 요청을 온라인으로 보내는 것입니다. 수동으로 1,000 개 정도의 이름을 15 시간 동안 수작업으로 Excel에 입력하는 대신 링크를 클릭하여 몇 초 만에 모든 것을 내보낼 수 있습니다.하나의 상위 행, 다른 테이블의 여러 하위 행. 그들 모두를 한 줄에 모으는 방법?

내 문제는 하나의 쿼리에서 데이터베이스의 데이터를 가져 오는 방법과 관련이 있습니다. 나는 가능하다고 믿지만 머리를 감쌀 수 없다.

선물을받을 아이들을위한 가족 정보가 들어있는 부모 테이블이 있습니다 (가족 당 1 행). 가족의 하위 정보 (하위 행당 1 행, 각 상위 행에 대한 많은 행)가 들어있는 하위 테이블이 있습니다. 각 상위 행에 대해 1-3 개의 하위 행이 있습니다.

PARENT TABLE 
----------------------------- 
id 
name 
address 
city 

CHILDREN TABLE 
----------------------------- 
parent_id 
name 
gift1 
gift2 
gift3 

내가이 CSV 파일에 넣을 수 있도록 데이터베이스에서 데이터를 내보낼 때 한 행에 정보를 어린이 '부모와 정보'모두를 좀하고 싶습니다. 두 가지 별도의 쿼리로이 작업을 수행 할 수 있음을 알고 있지만 가능하면 각 가족의 자식마다 데이터베이스에 기록하고 싶지 않습니다.

나는 이것을 한 시간 정도 숙고 해 보았고 이것을 어떻게 달성 할 수 있을지 전혀 생각할 수 없었다. 나는 테이블에 가입해야한다고 확신하지만 각 아이를 구별하고 다음 아이를 얻는 대신에 아이를 복제하는 것을 피하는 방법을 확신하지 못합니다.

+0

결과 행을 어떻게 보이게하는지 예를 들려 줄 수 있습니까? 상대적으로 단순한 피봇 테이블이지만 1 : 많은 관계로 인해 복잡합니다 (따라서 피봇 테이블의 열 이름이 중요해 지므로 최대 자식 수를 알아야합니다). 두 번째 쿼리를 사용하지 않는 이유는 무엇입니까? 더 유연해질 것입니다 ... – ircmaxell

+0

"부모의 정보가 한 줄에있는 모든 자녀 정보를 얻고 싶습니다."- 자녀 당 한 줄 (즉, 한 개의 부모에 대해 여러 행) 또는 부모 당 한 행 (즉, 같은 행에 같은 부모가있는 여러 자식)? –

+0

"각 부모 행에 1-3 개의 하위 행이 있습니다." 그래서 3 명 이상의 자녀를 둔 가정이 빠질 수 있습니까? –

답변

4

부모 당 어린이의 변수 번호, 모든 선물이 단일 레코드에서 분리 세미콜론으로 제시 SQL에서 수행 할 수있는 유일한 방법이 있으므로이 당신이 뭔가를 줄 것이다

SELECT p.*, GROUP_CONCAT(c.name, ': ', c.gift1, ', ', c.gift2, ', ', c.gift3 SEPARATOR ';') 
FROM parents p 
JOIN children с 
ON  c.parent_id = p.id 
GROUP BY 
     p.id 

가 :

parent  children_and_gifst 
Mr. Jones Alice: teddy bear, candy, drum; Bob: pup, sword, flute 

모든 어린이와 그 선물은 하나의 열에 있습니다.

+0

+1, 내가 알고 있다고 생각한 해결책을 찾지 못해서 미친 짓은 아니었다. 나머지 PHP를 사용하면 충분합니다. 고맙습니다. –

+1

너무 많은 하위 레코드가 없도록주의하십시오. 'GROUP_CONCAT()'은 길이가 제한되어 있으며 (서버 var'group_concat_max_len')이 한계를 초과하는 내용은 자릅니다. 기본값은 1024 바이트입니다. –

관련 문제