【问题标题】:MySQL - joining two queries (UNION?)MySQL - 加入两个查询(UNION?)
【发布时间】:2014-02-13 19:09:21
【问题描述】:

我有三张桌子:- - 订单(给我订单日期) - 订单行项目(让我能够将活动结果链接到订单日期) - 活动项目(给我活动结果)

我正在尝试在图表上绘制结果,并且可以使用以下查询成功地为小于

SELECT
  YEAR( od_date ) AS Year,
  MONTH( od_date ) AS Month,
  test_name,
  pd_name,
  COUNT( test_result ) AS Passed
FROM tbl_lab_item
  INNER JOIN tbl_order_item
    ON tbl_order_item.od_item_id = tbl_lab_item.od_item_id
  INNER JOIN tbl_order
    ON tbl_order.od_id = tbl_order_item.od_id
WHERE tbl_order.od_date >= DATE_SUB(now(), INTERVAL 12 MONTH)
    AND test_name = 'Test'
    AND pd_name = 'Product'
    AND test_result <= 50
    AND od_customer_id = '4'
GROUP BY test_name, YEAR(od_date), MONTH(od_date)ASC

我可以使用相同的查询对失败的结果执行类似操作,但在 Select 中使用 Count (test_result) AS Failed,并将 WHERE 条件更改为 >50。

如果可能的话,我想在一个查询中完成另外两件事。

首先,我希望能够将通过和失败合并到同一个查询中,这样我就可以得到月份、通过计数、失败计数。

其次,为了在图表上绘制所有这些,我可能需要显示所有月份,即使没有通过、失败或两者都有结果。根据我对 UNION 的理解,查询需要具有相同的形状,因此我可以将 Null as Failed 添加到 Pass 查询中,反之亦然,但是我如何将其合并为一种让所有月份都显示的方法?

我在这里查看How to get a count even if there are no results corresponding mysql? 以显示所有月份,但是我不知道将其集成到我的查询中。

希望这一切都有意义吗?

【问题讨论】:

    标签: mysql sql select count group-by


    【解决方案1】:

    试试这个:

    SELECT YEAR(od_date) AS `Year`, MONTH(od_date) AS `Month`, test_name, pd_name, 
           SUM(test_result <= 50) AS Passed, SUM(test_result > 50) AS Failes
    FROM tbl_lab_item li
    INNER JOIN tbl_order_item oi ON oi.od_item_id = li.od_item_id
    INNER JOIN tbl_order o ON o.od_id = oi.od_id
    WHERE o.od_date >= DATE_SUB(NOW(), INTERVAL 12 MONTH) AND test_name = 'Test' AND 
          pd_name = 'Product' AND od_customer_id = '4'
    GROUP BY test_name, YEAR(od_date), MONTH(od_date) ASC
    

    【讨论】:

    • 感谢您的支持,但仅显示出现结果的月份。有没有办法强制显示所有 12 个月,即使该月没有“通过”或“失败”?
    • 这个答案让我最接近我想要的解决方案,并且是我最终使用的那个:)
    【解决方案2】:

    通过和失败你都可以做到

    SELECT
      YEAR( od_date ) AS Year,
      MONTH( od_date ) AS Month,
      test_name,
      pd_name,
      SUM( IF(test_result <= 50 , 1 , 0) ) AS Passed,
      SUM( IF(test_result > 50 , 1 , 0) ) AS Failed
    FROM tbl_lab_item
      INNER JOIN tbl_order_item
        ON tbl_order_item.od_item_id = tbl_lab_item.od_item_id
      INNER JOIN tbl_order
        ON tbl_order.od_id = tbl_order_item.od_id
    WHERE tbl_order.od_date >= DATE_SUB(now(), INTERVAL 12 MONTH)
        AND test_name = 'Test'
        AND pd_name = 'Product'
        AND od_customer_id = '4'
    GROUP BY test_name, YEAR(od_date), MONTH(od_date)ASC
    

    从where子句中删除条件并将其放入选择中

    为第二部分创建一个表月份

        id  |   month
    -------------------
        1   |   1
        1   |   2
        1   |   3       
        1   |   4       
        1   |   5       
        1   |   6       
        1   |   7       
        1   |   8       
        1   |   9       
        1   |   10      
        1   |   11      
        1   |   12      
    

    现在加入吧

    SELECT
      YEAR( od_date ) AS Year,
      MONTH( od_date ) AS Month,
      test_name,
      pd_name,
      SUM( IF(test_result <= 50 , 1 , 0) ) AS Passed,
      SUM( IF(test_result > 50 , 1 , 0) ) AS Failed
    FROM tbl_lab_item
      INNER JOIN tbl_order_item
        ON tbl_order_item.od_item_id = tbl_lab_item.od_item_id
      INNER JOIN tbl_order
        ON tbl_order.od_id = tbl_order_item.od_id
      LEFT JOIN month ON months.month = MONTH(tbl_lab_item.od_date)
    WHERE tbl_order.od_date >= DATE_SUB(now(), INTERVAL 12 MONTH)
        AND test_name = 'Test'
        AND pd_name = 'Product'
        AND od_customer_id = '4'
    GROUP BY test_name, YEAR(od_date), MONTH(od_date)ASC
    

    【讨论】:

    • 谢谢。我可以看到逻辑,但是我收到一个错误,即“月份”表不存在。我认为您希望获得加入“AS 月”部分的结果,但似乎没有。
    • 我说创建一个表,其中有一个名为月的列
    • 啊,我做到了,尽管根据你的帖子称它为“几个月”。我会再试一次。
    猜你喜欢
    • 2012-10-11
    • 2013-05-18
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多