2010-08-18 34 views
1

我自願爲當地的非營利組織提供假日期間的玩具和食品。我幫助他們的一種方式是通過在線提交他們的禮物/食物請求。通過這種方式,您可以在15個小時內手動輸入1000個左右名稱到Excel中,只需點擊一個鏈接,即可在幾秒鐘內完成全部導出。一個父行,另一個表中有多個子行。如何將它們全部排成一行?

我的問題與我如何從一個查詢中的數據庫中獲取數據有關。我相信這是可能的,但不能籠罩我的頭,我可以做到。

有一個父表,其中包含將收到禮物(每家庭一行)的孩子的家庭信息。有一個包含家庭孩子信息的子表(每個孩子一行,每個父行多行)。每個父行將有1-3個子行。

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

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

我想從數據庫中導出數據時,因此它可以被放入一個CSV文件,讓所有的兒童信息與家長信息一行。我知道我可以用兩個單獨的查詢來做到這一點,但如果可能的話,我不想爲每個家庭的孩子都打數據庫。

我已經思考了一個小時左右,不能完全想出我會如何做到這一點。我相信我需要加入表格,但我不確定如何區分每個孩子,避免重複他們,而不是得到下一個孩子(如果有的話)。

+0

你可以舉一個例子來說明你想要的結果行嗎?這是一個相對簡單的數據透視表,但它由1:多關係複雜化(因此數據透視表的列名變得至關重要,因此您需要知道最大數量的子女)。爲什麼不使用第二個查詢?它會更加靈活...... – ircmaxell 2010-08-18 14:13:34

+0

「我想將父母的信息全部放在一行中獲得所有兒童的信息」 - 是每個孩子一行(即單個父母的多行)還是一行每個父母一行(即同一行上同一父母的多個孩子)? – 2010-08-18 14:32:16

+0

「每個父行將有1-3個子行。」那麼有三個以上孩子的家庭會錯過嗎? – 2010-08-18 14:33:14

回答

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來完成剩下的需求。謝謝。 – 2010-08-18 14:33:53

+1

小心不要有太多的孩子記錄。 'GROUP_CONCAT()'是長度受限的(服務器變量'group_concat_max_len'),並會截斷任何超過此限制的內容。默認值是1024字節。 – 2010-08-18 17:26:37

相關問題