PHP MySQL组的工作方式与其应有的不同
我试图让这个查询返回产品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” 我这样做对吗?我的问题是: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\
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;