2014-04-27 99 views
0

我有表示產品的具有三個不同的選項(大小,顏色等)如何從匹配對的MySQL表中找到共享鍵值?

############################## 
# VariationID # OptionID # 
############################## 
#   1 #  10 # 
#   1 #  20 # 
#   1 #  30 # 
#   2 #  11 # 
#   2 #  20 # 
#   2 #  30 # 
#   3 #  10 # 
#   3 #  22 # 
#   3 #  30 # 
#   4 #  10 # 
#   4 #  20 # 
#   4 #  33 # 
############################## 

通過我使用(Silverstripe)的PHP框架生成的表,所以該變化的兩列的MySQL表我不能輕易修改它。

如何識別哪個VariationID與特定選項匹配?

我可以運行一個MySQL查詢,它返回OptionIDs 10,20,30變體的VariationID?

如果在原始MySQL中不可能,那麼PHP中最好的方法是什麼?

+0

組合OptionID IN(...)','GROUP BY'和'HAVING COUNT(...)= 3' ...類似的問題已經多次討論過了,所以我建議你使用這些關鍵字進行一些研究。 – CBroe

+0

@CBroe對於MySQL優化器,IN(),GROUP BY和HAVING COUNT()是典型的答案。 –

+0

@EugenRieck,我知道這不是最好的表現方式 - 但是當它不再尋找3個選項時,你會怎麼做,但是有一兩個 - 寫二十個JOIN?不知道這是否更好。 – CBroe

回答

3

您可以直接使用SQL,但它是一個有點亂:

SELECT 
    A.VariationID AS VariationID 
FROM 
    tablename AS A 
    INNER JOIN tablename AS B ON A.VariationID=B.VariationID 
    INNER JOIN tablename AS C ON A.VariationID=C.VariationID 
WHERE 
    A.OptionID=10 
    AND B.OptionID=20 
    AND C.OptionID=30 

這將找到行的VariationID,即存在的10,20 OptionID值和`其中30

+0

有沒有你使用兩個連接而不是'in'的理由? – Musa

+1

經典的IN(),GROUP BY和HAVING COUNT()往往在MySQL上執行得非常糟糕,而JOIN則相當快,如果索引就位並且有合理的選擇性。 –

+0

完美 - 感謝您對此方法的評論與IN,GROUP BY,HAVING COUNT() - 非常有幫助。 – BaronGrivet

相關問題