SOL ile MySQL SELECT GRUP sorunu JOIN ve

2 Cevap php

Ben tarihleri ​​ve değerleri ile foo bir ana tablo var, ve bir tablo bar istisna tarihleri ​​ve değerleri ile. Tarih bar tablo varsa, bu değer, aksi takdirde, varsayılan foo değeri geçerlidir. Bu nedenle, örneğin:

foo
id  date        value
1   2009-11-19  25
2   2009-11-20  50

bar
id  date        value
1   2009-11-19  50

To select the right values I use the following type of query:

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

This works fine. The date "2009-11-19" exists in bar, so it selects the 50-value. But now I'd like to GROUP the results by MONTH, using this query:

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

Şimdi aya göre sonuç verir, böylece gruplama çalışıyor. Ancak, şimdi bar değerlerini yok sayar ve onu hiç bir eşleştirme yapmaz görünüyor. Ay için toplam 100 yerine 75 (foo foo + 50 25) (50 foo bar + 50) 'dir.

Bu işi yapmak için bir yolu var mı? Orada iki tablo arasında bir maç var, o aya göre gruplandırılarak sonra eğer doğru değerleri seçer? Böylece Ben ilk sorgu kullanın ve daha sonra PHP gruplandırma yapmak, ama bunun mümkün olmadığını düz MySQL doğru sonuçlar almak istiyorum olabilir.

2 Cevap

Böylece gibi, bir alt sorgu kullanmayı deneyin:

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

ana sorguda bir alt sorgu ve GROUP SEÇ yapın:

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;