即使未找到任何结果,也请选择所有行和组关系表

时间:2017-12-21 14:03:22

标签: mysql

我试图选择在特定时期内完成的所有类别和交易。为此,我有这个问题:

SELECT
    b.category, SUM(a.value) as 'total'

FROM
    transactions a,
    transactions_category b

WHERE a.type = 2
AND YEAR(a.date) = :year
AND MONTH(a.date) = :month
AND a.id_category = b.id

GROUP BY a.id_category
ORDER BY total DESC

这样可以正常工作,但它只选择与之关联的任何事务的类别。例如,如果我有一个名为' Internet'并且在那个月没有与互联网相关的交易'然后它不会显示在该列表上。

即使当月没有交易,我如何选择所有类别的交易总和?

预期结果如下:

category: 'Office', total: 240,00
category: 'Internet', total: 0,00
category: 'Food', total: 580,00
...

1 个答案:

答案 0 :(得分:3)

使用left加入并将所有过滤器从where子句移至on clasue

SELECT
    c.category, SUM(t.value) as 'total'
FROM transactions_category c
LEFT JOIN transactions t 
  ON t.id_category = c.id
  AND t.type = 2
  AND YEAR(t.date) = :year
  AND MONTH(t.date) = :month
GROUP BY c.category
ORDER BY total DESC

这样,您将始终获得左表的所有行,即类别表