SELECT值在第一个JOIN上不存在

时间:2015-03-29 07:46:10

标签: mysql sql

我希望按类别获得当月的当前总销售额。我还希望显示所有category_name(包括汽车),即使item_idcategory_id sales_tbl不存在,也不会给出0.00美元的销售额。

category_name  |  subTotalSales_ofMonth
---------------------------------------
   appliances  |    33 000
     cars      |         0
      IT       |   150 000

运行此

SELECT
c.category_name,
SUM(amount) AS subTotalSales_ofMonth   
FROM sales_tbl sa
INNER JOIN item_out_tbl io
ON io.item_id=sa.item_id
INNER JOIN category_tbl c
ON io.category_id=c.category_id
WHERE MONTH(sa.date_sold) >= $month)
GROUP BY io.category_id

给了我

category_name  |  subTotalSales_ofMonth
---------------------------------------
   appliances  |    33 000
      IT       |   150 000

3 个答案:

答案 0 :(得分:0)

您应该使用LEFT JOIN代替:

SELECT c.category_name,
SUM(amount) AS subTotalSales_ofMonth   
FROM sales_tbl sa
    LEFT JOIN item_out_tbl io ON io.item_id=sa.item_id
    LEFT JOIN category_tbl c ON io.category_id=c.category_id
WHERE MONTH(sa.date_sold) >= $month)
GROUP BY c.category_id

答案 1 :(得分:0)

全外连接将为您提供所需的结果(尽管它也会从category_name中获取NULL):

SELECT c.category_name, SUM(amount) AS subTotalSales_ofMonth   
FROM sales_tbl sa
    FULL OUTER JOIN item_out_tbl io ON io.item_id=sa.item_id
    FULL OUTER JOIN category_tbl c ON io.category_id=c.category_id
WHERE MONTH(sa.date_sold) >= $month)
GROUP BY io.category_id

请查看this以获取有关所有联接的指南。

答案 2 :(得分:0)

您需要使用外部联接。由于您的所有类别都存储在category_tbl表中,因此该表应位于连接的外侧。实现这一目标的一种方法是更改​​联接的顺序,并在两种情况下使用LEFT JOIN。您还需要将WHERE条件移动到ON子句之一:

SELECT
  c.category_name,
  SUM(amount) AS subTotalSales_ofMonth   
FROM
  category_tbl AS c
  LEFT JOIN item_out_tbl AS io ON io.category_id = c.category_id
  LEFT JOIN sales_tbl    AS sa ON io.item_id = sa.item_id
                              AND MONTH(sa.date_sold) >= $month
GROUP BY
  c.category_id
;