2010-02-22 65 views
2

你有兩個假設表:具有多對多數據字段的查詢生成表,最佳實踐?

TABLE 1 
[id] [item] [amount] [cost] 
1  hat  20  10 
2  shoe 7   45 
3  belt 2   25 

TABLE 2 (many to many) 
[item] [color] 
hat  blue 
hat  red 
hat  yellow 
shoe black 
shoe white 
etc. etc. 

,當你運行一個查詢,您要輸出,包括所有的數據都像這樣的列表:

[ITEM] [AMOUNT] [COST] [AVAILABLE COLORS] 
hat  20  10  blue, red, yellow 
shoe 7   45  black, white 
etc. 

如果顏色不目前,它將是一個查詢來從一個表中獲取所有信息並在循環中處理該數組。但是,以適應TABLE 2我能想到的兩種方法可以做到這一點:

蠻力:運行查詢,爲每一個迴歸得到的數據從TABLE 2,加逗號,並從TABLE 1插入到結果陣列,然後輸出HTML表格

醜陋的解決方法:添加一個新列Table 1並定期與數據串從Table 2幕後

...有一個更好的辦法,僅次於更新?

回答

2

如果您正在使用MySQL,那麼GROUP_CONCAT函數可能會讓您感興趣。

例如,見這個問題:Can I concatenate multiple MySQL rows into one field?


否則,您所描述的「蠻力」解決方案通常是所使用的一個 - 一個可能的優化是隻做1查詢來獲取從第二線一次對應於第一個表中所有行的表。

舉例來說,你最好:

  • 做查詢,以從第一臺
  • 獲得這些數據做一個查詢來獲取第二個表對應於數據從第一個表中的所有數據 - 像select * from table_2 where item in ('hat', 'shoe', 'belt')
  • 使用循環在PHP端從第二查詢從第一個

「重新連接」的結果的結果通過這一解決方案,你」我會在PHP方面做更多的工作,但只有2個查詢 - 而不是1 +(從第一個查詢返回的行數);當你有很多從第一個查詢返回的行時,它通常好得多。

+0

哦!我*喜歡*在一個大型查詢中剝離Table2然後讓PHP完成所有分組和插入的想法。顯然沒有想到這一點!非常感謝你! – Drew 2010-02-22 06:32:46

+0

不客氣:-) ;;這是我用過幾次的解決方案;從O(n)查詢到O(常量)往往感覺很好^^ *(當然,不要忘記分析這兩種解決方案 - 但通常較少的查詢更好)* – 2010-02-22 06:37:24