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

mySQL,需要帮助将多个子查询转换为一个SELECT查询(显示13列),mysql,subquery,mysql-error-1242,Mysql,Subquery,Mysql Error 1242,这是我的第一篇文章。我知道这是非常低效和重复的代码,实际上无法工作,我需要做的是将所有这些输出合并到一个select语句中。很明显,我对这方面还不太熟悉,但我已经做了一整天了,我只是无法从正确的方向开始,每个片段都是独立工作的……请帮助 基本上,我使用的是一个包含许多表的数据库,为了为每一列获得正确的数据,我通常需要考虑3个包含联接的表 谢谢你的帮助 SELECT Product.ProductID, ( SELECT Abbreviation AS Country FROM

这是我的第一篇文章。我知道这是非常低效和重复的代码,实际上无法工作,我需要做的是将所有这些输出合并到一个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
    表中,否则您为什么要加入它呢

  • 如果此部件有问题,请将第二个联接更改为
    左联接
    。我在执行
    左连接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,那么您为什么关心性能呢?您太棒了!我玩了它多一点,它能正常地返回所有东西!