mySQL,需要帮助将多个子查询变为1个SELECT查询(显示13列)
这是我的第一篇文章。我知道这是非常低效的重复性代码,实际上并不能正常工作,我需要做的就是将所有这些输出合并到一个select语句中。我显然是相当新的,但我一整天都在这里,我无法开始正确的方向,每个片段都可以独立运作......请大家帮忙!mySQL,需要帮助将多个子查询变为1个SELECT查询(显示13列)
本质上,我正在与一个有很多表的数据库一起工作,为了获得每列的正确数据,我经常必须考虑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
你真了不起!我多玩了一会儿,然后马上恢复正常! – user2301252 2013-04-20 05:21:13
这是一个好消息 - 我很高兴它解决了! – 2013-04-20 05:50:26
一些子查询使用mysql功夫(魔术组),不能很容易地带出来。我认为你应该从头开始。拍摄输出快照并继续处理新版本,直到其输出结果相同。 – Bohemian 2013-04-20 04:20:32
@Bohemian如果最终目标是将这13列导出为excel,那么我最好使用php来操纵输出吗? – user2301252 2013-04-20 04:29:10
我会避免引入另一层。获取正确的查询。另外,如果查询有效,并且只输出为excel,那么为什么您关心性能? – Bohemian 2013-04-20 05:53:53