PHP MySQL组的工作方式与其应有的不同

PHP MySQL组的工作方式与其应有的不同,php,mysql,group-concat,Php,Mysql,Group Concat,我试图让这个查询返回产品ID、描述和每个产品的所有成分的列表。显示的查询执行良好,但只返回一条记录—表中的第一个产品ID、其对应的描述以及配料表中的每个配料。返回的成分按正确的顺序正确分组,但它们都连接到一个结果中。例如: 产品1含有成分A1、B1、C1 产品2含有成分A2、B2、C2、D2 当前查询的结果是: [Product1_ID]、[Product1_Description]、“A1、B1、C1、A2、B2、C2、D2” 我想要的是: [Product1\u ID]、[Product1\

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

产品1含有成分A1、B1、C1 产品2含有成分A2、B2、C2、D2

当前查询的结果是:

[Product1_ID]、[Product1_Description]、“A1、B1、C1、A2、B2、C2、D2”

我想要的是:

[Product1\u ID]、[Product1\u Description]、“A1、B1、C1” [Product2\u ID]、[Product2\u描述]、“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;

您需要一个GROUPBY子句。我还建议使用联接,但这是您的决定

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

您需要一个
groupby
语句来获取所需内容

但是,您的查询确实需要更多的工作。您需要学习正确的连接语法(在条件中使用
join
关键字和
on
):

您的查询之所以有效是因为MySQL的一个怪癖。大多数数据库都会生成错误,因为
select
中的列既不在
groupby
子句中,也不在聚合函数中


MySQL认识到整个查询正在进行聚合。然后,它为前两列选择任意值,并将所有产品中的所有成分连接在一起。

谢谢您的建议。很明显,我是SQL新手,但我的大学教授建议不要使用join关键字。我忘了为什么,though@JoeBoris . . . 要么你误解了你的教授,要么他/她错了。自1992年以来,
join
关键字是SQL标准的真正组成部分。它还允许您执行
,以及经常执行的
完整
联接,这是使用隐式联接语法不容易完成的。好的,我将研究此语法,并开始以这种方式进行联接。谢谢你的帮助
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;