0

我有以下查询从多个表中获取产品 ID、产品名称、价格、描述和成分。

SELECT TP.intProductID AS ProductID, TP.strName AS Name, TPP.decPrice AS Price,
TD.strDescription AS Description, GROUP_CONCAT( TRH.strName     SEPARATOR ', ' ) AS Ingredients 
FROM TProducts TP JOIN

     TProductsPrices TPP 
     on TP.intProductID=TPP.intProductID JOIN

     TProductsDescriptions TPD 
     on TP.intProductID=TPD.intProductID 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;

查询以应有的方式查找所有产品信息,但我希望能够在我的结果中包含描述表中没有描述的产品(并且可能返回 null 或空字符串)。我怎么能做这样的事情?

4

2 回答 2

0

您以典型的方式构建了查询,其中您有一个产品表,然后从中导入内容。要将所有内容保留在产品表中,所有连接都应该是left outer joins。此外,连接productId应该回到原始表:

SELECT TP.intProductID AS ProductID, TP.strName AS Name, TPP.decPrice AS Price,
       TD.strDescription AS Description,
       GROUP_CONCAT( TRH.strName     SEPARATOR ', ' ) AS Ingredients 
FROM TProducts TP left outer JOIN
     TProductsPrices TPP 
     on TP.intProductID=TPP.intProductID left outer JOIN
     TProductsDescriptions TPD 
     on TP.intProductID=TPD.intProductID left outer JOIN
     TDescriptions TD
     on TPD.intDescriptionID=TD.intDescriptionID left outer JOIN
     TProductsIngredients TPI
     on TP.intProductID=TPI.intProductID left outer JOIN
     TRawHerbs TRH
     on TPI.intIngredientID=TRH.intRawHerbID
GROUP BY TPD.intProductID;

这会将所有产品保留在 中TProducts,无论它们在其他表中是否有匹配项。

一般来说(特别是如果您正在学习连接),我建议您joinfrom子句中坚持一种类型。这种结构,其中所有内容都是left outer join“将所有内容保留在第一个表中”。

于 2013-06-29T22:17:35.077 回答
0

将适用的内连接更改为左外连接。像这样的东西:

SELECT TP.intProductID AS ProductID, TP.strName AS Name, TPP.decPrice AS Price,
TD.strDescription AS Description, 
GROUP_CONCAT( TRH.strName     SEPARATOR ', ' ) AS Ingredients 
FROM TProducts TP JOIN

 TProductsPrices TPP 
 on TP.intProductID=TPP.intProductID 

left JOIN TProductsDescriptions TPD 
 on TP.intProductID=TPD.intProductID 

left 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;
于 2013-06-29T12:39:34.187 回答