MySQL SELECT FOR LEFT JOIN和GROUP问题

MySQL SELECT FOR LEFT JOIN和GROUP问题

问题描述:

我有一个主表foo带日期和值,以及一个表带有例外日期和值的。如果日期存在于表中,则该值适用,否则为默认foo值。因此,举例来说:MySQL SELECT FOR LEFT JOIN和GROUP问题

 
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对结果进行分组,使用这个查询:

 
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 

它现在按月返回结果,所以分组工作正常。但是,它现在忽略了的值值,而且它看起来根本没有做任何匹配。本月的总数为75(从foo + 25到25),而不是100(从50到50)。

有没有办法让这项工作?这样,如果两个表格之间存在匹配,并且按月分组,那么它会选择正确的值?之后我可以使用第一个查询并在PHP中进行分组,但是如果可能的话,我希望直接从MySQL获得正确的结果。

+0

添加SUM()周围的IF()? – 2009-11-19 21:18:56

尝试使用子查询,像这样:

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 
+0

+1:正是我在输入的内容。 – 2009-11-19 21:18:46

+0

很棒!谢谢你的帮助。 – Alec 2009-11-19 23:28:14

做一个子查询和组选择主查询:

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; 
+0

为什么?这不会改变结果。 GROUP BY在第一次执行select之后发生,因此您无缘无故地从派生表中选择结果。如果我错过了某些东西,那很好,但我没有看到子选择的重点。 – 2009-11-19 21:23:31