【问题标题】:Complex MySQL join statement复杂的 MySQL 连接语句
【发布时间】:2016-07-01 22:49:24
【问题描述】:

我意识到这里有很多 MySQL 帖子,每个帖子都特定于海报使用。我有一个相当复杂的加入情况。

我有 3 个表,并试图在两列上聚合数据。我对 ProductID 和 ProductionMonth 进行分组。

我快到了,但现在我的数据集的日期列分组有一个症结所在。

我的数据输出当前没有填充特定月份没有的数据。我需要它至少显示零和日期。

现在的输出是这样的:

<pre>
Products    TOTAL   CANCELLED   Product Name    ProductType     ProductionMonth 
    2        32          5        Advantage        VSC Auto       2016-02-02
    2        26          3        Advantage        VSC Auto       2016-01-01
    2        31          2        Advantage        VSC Auto       2015-12-01
    16        5          1          ASC          VSC Auto         2016-02-01
    16        4          4          ASC          VSC Auto         2016-01-01
    17        0          0       MenuVantage    Menu Software     NULL
    21       12          0          CSO             Credit        2016-02-01
    21       24          0          CSO             Credit        2016-01-01
</pre>

但即使没有与该记录关联的日期,我也需要数据包含日期。这是我当前的代码:

<pre>
SELECT P.Products, Inv.TOTAL,Inv.CANCELLED, Pur.ProductName AS 'Product Name',ProductType,ProductionMonth
FROM Dealership_Products P
LEFT JOIN (SELECT ProductsID, SUM(Total) AS TOTAL, SUM(Cancelled) AS CANCELLED,ProductionMonth
          FROM Monthly_Production_Numbers 
           WHERE DealershipID = '25'
           AND
           ProductionMonth > DATE_SUB(CURDATE(), INTERVAL 1 MONTH) - INTERVAL 3 MONTH
           GROUP BY ProductionMonth,ProductsID) AS Inv
ON P.Products = Inv.ProductsID
LEFT  JOIN (SELECT ProductsID, ProductName AS ProductName, ProductType
            FROM Products 
            GROUP BY ProductsID) AS Pur
ON P.Products = Pur.ProductsID
WHERE DealershipID = '25'
AND
Inactive = 'FALSE'
ORDER BY Products ASC, ProductionMonth DESC
</pre>

正在使用的表:

Dealership_Products
  column (Products)  ->      
Products.ProductsID

Monthly_Production_Numbers 按(ProductionMonth)“过去 3 个月”分组 按 (ProductsID) 分组

产品

由于数据和表格非常复杂,我无法共享所有结构。但主要部分在这里。

感谢您的帮助!

【问题讨论】:

  • 一般来说,数据显示问题最好在表示层(例如 PHP 循环)中处理(如果可用)。
  • 它是可用的,但我知道也可以通过一些巧妙的 MySQL 行来获得完整的色域。如果走 MySQL 路线会更有效率。谢谢。
  • 没有。本身并没有提高效率。
  • 没错,我的意思是提供所需结果所需的代码行。也许以更优雅的方式。 ;)
  • 我们对优雅有不同的定义:-)

标签: mysql group-by inner-join


【解决方案1】:

使用 IFNULL 怎么样?

IFNULL(ProductionMonth,'date-you-want') as ProductionMonth

【讨论】:

  • 不确定您建议我将您提到的 IFNULL 行放在哪里。我假设在 SELECT 行内。试过了,结果一样。谢谢!
  • 您仍然需要一些机制来生成 IFNULL 值(注意 COALESCE() 符合标准)。这可以通过 UNION 或实用程序表(例如所有可能日期的表或整数表 [0-9])来充当生成缺失值的种子。但我的偏好是应用层中的循环。
  • 对于如何遍历我上面的输出示例并通过某种形式的应用层用日期填充缺失的行,您有任何代码示例或建议吗?
猜你喜欢
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多