2010-05-12 46 views
0

我想建立一個MySQL查詢,使用查找表中的行作爲結果集中的列。如何在查詢表中將行用作MySQL查詢中的列?

LookupTable中

id | AnalysisString 
1 | color 
2 | size 
3 | weight 
4 | speed 

ScoreTable

id | lookupID | score | customerID 
    1 |  1 | A |  1 
    2 |  2 | C |  1 
    3 |  4 | B |  1 
    4 |  2 | A |  2 
    5 |  3 | A |  2 
    6 |  1 | A |  3 
    7 |  2 | F |  3 

我想這將使用在查詢相關LookupTable中的行,列的查詢,這樣我可以得到這樣一個結果:

customerID | color | size | weight | speed 
    1   A  C     D 
    2     A  A  
    3   A  F 

問題的原因在於可能會將其他行添加到LookupTa ble,並且查詢應該是動態的並且不具有硬編碼的查找ID。也就是說,這將工作:

SELECT st.customerID, 
(SELECT st1.score FROM ScoreTable st1 WHERE lookupID=1 AND st.customerID = st1.customerID) AS color, 
(SELECT st1.score FROM ScoreTable st1 WHERE lookupID=2 AND st.customerID = st1.customerID) AS size, 
(SELECT st1.score FROM ScoreTable st1 WHERE lookupID=3 AND st.customerID = st1.customerID) AS weight, 
(SELECT st1.score FROM ScoreTable st1 WHERE lookupID=4 AND st.customerID = st1.customerID) AS speed 
FROM ScoreTable st 
GROUP BY st.customerID 

直到有第五行添加到LookupTable。 。 。

也許我打破了整個關係模型,並且必須在後端PHP代碼中解決這個問題?

感謝指點/指導。

tom

回答

1

您構建了一個EAV數據庫。在可維護性,效率和正確性方面準備好了很多痛苦。 「這是數據建模中的設計異常之一。」 (http://decipherinfosys.wordpress.com/2007/01/29/name-value-pair-design/

最好的解決方案是將數據庫重新設計成更正常的東西。

+0

當你說「更正常」時,你的意思是更規範嗎?如果沒有殘餘的「id」列,則「ScoreTable」將在6NF中。 – 2010-05-12 14:13:19

1

你正在做的事通常被稱爲交叉列表或交叉表查詢。一些DBMS直接支持交叉表,但MySQL不是其中之一,AFAIK(博客文章here描述了模擬效果的艱難過程)。

兩個選項浮現在腦海中處理這個:

  1. 不要交叉表都沒有。相反,請按行ID對AnalysisString進行排序,然後使用編程語言生成表格輸出。
  2. 在您的編程語言中即時生成代碼以發出適當的查詢。
  3. 請按照上面提到的博客來實現服務器端解決方案。

另請考慮@ Marek的回答,這表明您可能會更好地重構您的模式。然而,這個建議不是給定的。有時,關鍵值模型適用於手頭的問題。