2013-05-29 20 views
1

我試圖讓這個查詢返回產品ID,說明和每個產品的所有成分的列表。所顯示的查詢執行正常,但只返回一條記錄 - 表中的第一個產品ID,其相應描述以及成分表中的每個成分。返回的成分按照正確的順序進行了適當的分組,但它們都被連接成一個結果。例如:PHP MySQL GROUP_CONCAT工作不同於它應該

產品1具有的成分A1,B1,C1 產品2具有成分A2,B2,C2,D2

而當前查詢的結果是:

[Product1_ID],[Product1_Description] 「A1,B1,C1,A2,B2,C2,D2」

我想是:

[Product1_ID],[Product1_Description], 「A1,B1,C1」 [Product2_ID],[Product2_Description ],「A2,B2,C2,D2」

我對此有正確的看法嗎?這是我的查詢:

SELECT TPD.intProductID AS ProductID, 
TD.strDescription AS Description, 
GROUP_CONCAT(TRH.strName SEPARATOR ', ') AS Ingredients 

FROM TProductsDescriptions AS TPD, 
TDescriptions AS TD, 
TRawHerbs AS TRH, 
TProductsIngredients AS TPI 

WHERE TPD.intDescriptionID=TD.intDescriptionID 
AND TPD.intProductID=TPI.intProductID 
AND TPI.intIngredientID=TRH.intRawHerbID; 

回答

0

您需要一個group by聲明才能得到您想要的。

但是,您的查詢確實需要更多的工作。你需要學會正確的連接語法(使用join關鍵字和on爲條件):

SELECT TPD.intProductID AS ProductID, TD.strDescription AS Description, 
     GROUP_CONCAT(TRH.strName SEPARATOR ', ') AS Ingredients 
FROM TProductsDescriptions TPD join 
    TDescriptions TD 
    on TPD.intDescriptionID=TD.intDescriptionID join 
    TProductsIngredients TPI 
    on TPD.intProductID=TPI.intProductID join 
    TRawHerbs TRH 
    on TPI.intIngredientID=TRH.intRawHerbID 
group by TPD.intProductID; 

您的查詢工作的原因是MySQL的一個怪癖。大多數數據庫都會產生錯誤,因爲select中的列既不在group by子句中,也不在聚合函數中。

MySQL認識到整個查詢正在進行聚合。然後它爲前兩列選擇任意值,並將所有產品的所有成分連接在一起。

+0

感謝您的意見。我對SQL很陌生,但我的大學教授建議不要使用join關鍵字。我忘記了爲什麼,儘管 –

+0

@JoeBoris。 。 。要麼你誤解了你的教授,要麼他/她錯了。 'join'關鍵字自1992年以來就是SQL標準的一個真正的部分。它還允許你執行'left','right',並且通常是'full'連接,這很難用隱式連接語法完成。 –

+0

好吧,我會研究這個語法,並開始以這種方式加入,而不是我猜。謝謝你的幫助 –

2

您需要一個GROUP BY子句。我也建議使用連接,但這是你的電話。

SELECT TPD.intProductID AS ProductID, 
TD.strDescription AS Description, 
GROUP_CONCAT(TRH.strName SEPARATOR ', ') AS Ingredients 

FROM TProductsDescriptions AS TPD, 
TDescriptions AS TD, 
TRawHerbs AS TRH, 
TProductsIngredients AS TPI 

WHERE TPD.intDescriptionID=TD.intDescriptionID 
AND TPD.intProductID=TPI.intProductID 
AND TPI.intIngredientID=TRH.intRawHerbID 

GROUP BY TPD.intProductID