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获得正确的结果。
尝试使用子查询,像这样:
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:正是我在输入的内容。 – 2009-11-19 21:18:46
很棒!谢谢你的帮助。 – 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;
为什么?这不会改变结果。 GROUP BY在第一次执行select之后发生,因此您无缘无故地从派生表中选择结果。如果我错过了某些东西,那很好,但我没有看到子选择的重点。 – 2009-11-19 21:23:31
添加SUM()周围的IF()? – 2009-11-19 21:18:56