2013-04-20 30 views
1

这是我的第一篇文章。我知道这是非常低效的重复性代码,实际上并不能正常工作,我需要做的就是将所有这些输出合并到一个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 
+0

一些子查询使用mysql功夫(魔术组),不能很容易地带出来。我认为你应该从头开始。拍摄输出快照并继续处理新版本,直到其输出结果相同。 – Bohemian 2013-04-20 04:20:32

+0

@Bohemian如果最终目标是将这13列导出为ex​​cel,那么我最好使用php来操纵输出吗? – user2301252 2013-04-20 04:29:10

+0

我会避免引入另一层。获取正确的查询。另外,如果查询有效,并且只输出为excel,那么为什么您关心性能? – Bohemian 2013-04-20 05:53:53

回答

0

首先,一些注意事项和假设...

  • 我假设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 
+0

你真了不起!我多玩了一会儿,然后马上恢复正常! – user2301252 2013-04-20 05:21:13

+0

这是一个好消息 - 我很高兴它解决了! – 2013-04-20 05:50:26