mySQL,需要帮助将多个子查询转换为一个SELECT查询(显示13列)
这是我的第一篇文章。我知道这是非常低效和重复的代码,实际上无法工作,我需要做的是将所有这些输出合并到一个select语句中。很明显,我对这方面还不太熟悉,但我已经做了一整天了,我只是无法从正确的方向开始,每个片段都是独立工作的……请帮助 基本上,我使用的是一个包含许多表的数据库,为了为每一列获得正确的数据,我通常需要考虑3个包含联接的表 谢谢你的帮助mySQL,需要帮助将多个子查询转换为一个SELECT查询(显示13列),mysql,subquery,mysql-error-1242,Mysql,Subquery,Mysql Error 1242,这是我的第一篇文章。我知道这是非常低效和重复的代码,实际上无法工作,我需要做的是将所有这些输出合并到一个select语句中。很明显,我对这方面还不太熟悉,但我已经做了一整天了,我只是无法从正确的方向开始,每个片段都是独立工作的……请帮助 基本上,我使用的是一个包含许多表的数据库,为了为每一列获得正确的数据,我通常需要考虑3个包含联接的表 谢谢你的帮助 SELECT Product.ProductID, ( SELECT Abbreviation AS Country FROM
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
- 如果此部件有问题,请将第二个联接更改为
。我在执行左联接
之后再执行左连接a到b
时偶尔会遇到问题。我发现保持内部连接b到c
左连接更容易,因此我的示例左连接了两个表:
LEFT JOIN Resource r ON p.ManufactureCode = r.ResourceID INNER JOIN Resource rr ON p.BrandCode = rr.ResourceID
- 您以两种不同的方式加入
资源。MySQL(以及所有主流数据库)完全可以这样做。您只需对一个或两个连接进行别名。我给其中一个加了别名:
LEFT JOIN Resource ON Product.ManufactureCode ... LEFT JOIN Resource BrandResource ON Product.BrandCode...
- 从您的示例中,我不知道
是如何连接的。你必须提供这个ProductStatus
- 使用下面的示例从小处开始。加入
,然后当你已经开始工作时,加入国家
,然后加入制造商
,然后加入品牌
,等等。查询并没有做很多高级的事情;这很复杂,主要是因为桌子太多了。一次解决一个问题,你会赢:)测量
- 最后,正如@Bohemian在评论中指出的那样,
无法上升到顶部。事实上,它可能会,但它会使事情复杂化,超出人们的想象。我把它留作子查询groupby
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 Kungfu(神奇的群组),这是不容易实现的。我认为你应该从头开始。拍摄输出的快照,并继续处理新版本,直到其输出相同。@Bohemian如果最终目标是将这13列导出到excel中,我最好使用php来处理输出吗?我会避免引入另一层。把问题弄对。另外,如果查询有效,并且您只导出到excel,那么您为什么关心性能呢?您太棒了!我玩了它多一点,它能正常地返回所有东西!