带有LEFT JOIN和GROUP问题的MySQL SELECT

时间:2009-11-19 21:14:57

标签: php mysql

我有一个带有日期和值的主表 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获得正确的结果。

2 个答案:

答案 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;