mySQL,需要帮助将许多子查询转换为 1 个 SELECT 查询(显示 13 列)

标签 mysql subquery mysql-error-1242

这是我的第一篇文章。我知道这是非常低效和重复的代码,实际上不会起作用,我需要做的是将所有这些输出组合成 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 binner 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/

相关文章:

mysql - 在 INSERT INTO 语句 MySQL 中引用当前行

mysql - 如何在 Mysql 中解决此问题(#1242 - 子查询返回超过 1 行)?

mysql - Spring 启动 MySQL : LAZY Loading issue - No operations allowed after statement closed

mysql - SQL Server 到 MySQL 数据传输

mysql - 无法从 EC2 实例连接到 RDS 实例

mysql - 使用 "IN"关键字的子查询

mysql - mysql删除重复行的方法

php - 移动文件后 Wordpress 出现问题

SQL NOT IN 可能存在性能问题

mysql - 在存储过程中检索多行