1

我试图让这个查询返回产品 ID、描述和每个产品的所有成分的列表。显示的查询执行良好,但只返回一条记录——表中的第一个产品 ID、其相应的描述以及成分表中的每个成分。返回的成分按正确的顺序正确分组,但它们都连接成一个结果。例子:

产品 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;
4

2 回答 2

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
于 2013-05-29T20:13:10.833 回答
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 认识到整个查询正在进行聚合。然后它为前两列选择任意值,并将所有产品中的所有成分连接在一起。

于 2013-05-29T20:15:10.997 回答