这是我的第一篇文章。我知道这是非常低效和重复的代码,实际上不会起作用,我需要做的是将所有这些输出组合成 1 个 select 语句。我显然在这方面还很陌生,但我已经做了一整天了,我就是无法从正确的方向开始,每个片段都是独立工作的……请帮忙!
本质上,我正在使用一个包含许多表的数据库,并且要为每一列获取正确的数据,我通常必须考虑 3 个具有连接的表。
感谢任何见解或帮助!
SELECT
Product.ProductID,
(
SELECT Abbreviation AS Country
FROM Product
LEFT JOIN ProductCountry
ON Product.ProductID = ProductCountry.ProductID
LEFT JOIN Location
ON ProductCountry.LocationID = Location.LocationID
GROUP BY Product.ProductID
),
(
SELECT r.ResourceName AS Manufacturer, rr.ResourceName AS Brand
FROM Product p
LEFT JOIN Resource r
ON p.ManufactureCode = r.ResourceID
INNER JOIN Resource rr
ON p.BrandCode = rr.ResourceID
),
Product.Name,
Product.UPC,
Product.Size,
(
SELECT Unit.abbreviation AS Measure
FROM Product
LEFT JOIN Unit
ON Product.Unit = Unit.UnitID
),
(
SELECT Category.ParentID AS Category, Category.Description AS Sub_Category
FROM Product
LEFT JOIN ProductCategory
ON Product.ProductID = ProductCategory.ProductID
LEFT JOIN Category
ON ProductCategory.CategoryID = Category.CategoryID
),
(
SELECT i.Description AS INGREDIENTS, i.MayContain AS Allergen_Statement
FROM Product
LEFT JOIN Ingredient i
ON Product.ProductID = i.IngredientID
),
(
SELECT GROUP_CONCAT( Special.Description SEPARATOR ', ' ) AS Free_From
FROM Product
LEFT JOIN ProductSpecial
ON Product.ProductID = ProductSpecial.ProductID
LEFT JOIN Special
ON ProductSpecial.SpecialID = Special.SpecialID
GROUP BY Product.ProductID
)
FROM Product, ProductStatus
WHERE ProductStatus.ProductStatusID = 1
最佳答案
首先,一些注意事项和假设...
我假设
Country
列在Location
表中,否则您为什么要加入它。如果您在这部分遇到问题,请将第二个连接更改为
LEFT JOIN
。我在执行left join a to b
和inner join b to c
时偶尔会遇到麻烦。我发现保持LEFT JOIN
更容易,所以我的示例左连接两个表:LEFT JOIN Resource r ON p.ManufactureCode = r.ResourceID INNER JOIN Resource rr ON p.BrandCode = rr.ResourceID
您将以两种不同的方式加入
Resource
。这对 MySQL(以及所有主流数据库)来说完全没问题。您只需为其中一个或两个连接添加别名。我为其中之一起了别名:LEFT JOIN Resource ON Product.ManufactureCode ... LEFT JOIN Resource BrandResource ON Product.BrandCode...
我不知道您的示例是如何加入
ProductStatus
的。你必须提供它。使用下面的示例从小处着手。加入
Country
,然后当你完成工作时,加入Manufacturer
,然后是Brand
,然后是Measure
等。查询并没有做很多高级的事情;它很复杂,主要是因为表的数量太多。一次解决一个,你就会赢:)最后,正如@Bohemian 在评论中指出的那样,
GROUP BY
无法置顶。实际上,它可能可以,但它会使事情变得难以置信地复杂化。我将其保留为子查询。
这是最终结果。请注意,它没有经过测试,因为它很大而且我没有表结构或示例数据。但主要是因为它很大 :) 无论如何,这仅作为示例。
SELECT
Product.ProductID,
Location.Country,
Resource.ResourceName AS Manufacturer,
BrandResource.ResourceName AS Brand,
Product.Name,
Product.UPC,
Product.Size,
Unit.Abbreviation AS Measure,
Category.ParentID AS Category,
Category.Description AS Sub_Category,
Ingredient.Description AS Ingredients,
Ingredient.MayContain AS Allergen_Statement,
(SELECT GROUP_CONCAT( Special.Description SEPARATOR ', ' ) AS Free_From
FROM Product
LEFT JOIN ProductSpecial
ON Product.ProductID = ProductSpecial.ProductID
LEFT JOIN Special
ON ProductSpecial.SpecialID = Special.SpecialID
GROUP BY Product.ProductID
)
FROM Product
INNER JOIN ProductStatus ON ... however it's joined
LEFT JOIN ProductCountry ON Product.ProductID = ProductCountry.ProductID
LEFT JOIN Location ON ProductCountry.LocationID = Location.LocationID
LEFT JOIN Resource ON Product.ManufactureCode = Resource.ResourceID
LEFT JOIN Resource BrandResource ON Product.BrandCode = BrandResource.ResourceID
LEFT JOIN Unit ON Product.Unit = Unit.UnitID
LEFT JOIN ProductCategory ON Product.ProductID = ProductCategory.ProductID
LEFT JOIN Category ON ProductCategory.CategoryID = Category.CategoryID
LEFT JOIN Ingredient ON Product.ProductID = i.IngredientID
WHERE ProductStatus.ProductStatusID = 1
关于mySQL,需要帮助将许多子查询转换为 1 个 SELECT 查询(显示 13 列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16116416/