我有一个带有日期和值的主表 foo ,以及一个带有例外日期和值的表 bar 。如果日期存在于栏表中,则该值适用,否则为默认值 foo 。所以,例如:
foo id date value 1 2009-11-19 25 2 2009-11-20 50 bar id date value 1 2009-11-19 50
要选择正确的值,我使用以下类型的查询:
SELECT
f.date,
IF (f.date = b.date, b.value, f.value) AS value
FROM foo f
LEFT JOIN bar b
ON b.date = f.date
这很好用。日期“2009-11-19”存在于栏中,因此它选择50值。但现在我想使用以下查询对MONTH的结果进行GROUP:
SELECT
MONTH(f.date) AS month,
IF (f.date = b.date, b.value, f.value) AS value
FROM foo f
LEFT JOIN bar b
ON b.date = f.date
GROUP BY month
现在按月返回结果,因此分组工作正常。但是,它现在忽略了 bar 值,它似乎根本不做任何匹配。这个月的总数是75(foo为25,foo为50)而不是100(来自bar的50 +来自foo的50)。
有没有办法让这项工作?如果两个表之间存在匹配,并在按月分组后,它会选择正确的值吗?我可以使用第一个查询,然后在PHP中进行分组,但如果可能的话,我想直接从MySQL获得正确的结果。
答案 0 :(得分:2)
尝试使用子查询,如下所示:
SELECT MONTH(date), value FROM
(SELECT
f.date,
IF (f.date = b.date, b.value, f.value) AS value
FROM foo f
LEFT JOIN bar b ON b.date = f.date)
GROUP BY month
答案 1 :(得分:0)
在子查询中执行SELECT,在主查询中执行GROUP:
SELECT themonth, SUM(myvalue) FROM (
SELECT
MONTH(f.date) AS themonth,
IF (f.date = b.date, b.value, f.value) AS myvalue
FROM foo f
LEFT JOIN bar b
ON b.date = f.date) tmptable
GROUP BY themonth;