ugrás a tartalomhoz

mysql count on multiple tables, group by date

jaczkog · 2009. Ápr. 30. (Cs), 11.54
Sziasztok!

Adott két MySQL tábla TIMESTAMP mezőkkel. Szeretném egy lekérdezésben összeszámolni mindkét táblában a bejegyzéseket napi bontásban, tehát egy ilyet szeretnék látni:

date            table1  table2
2009-04-16      5       NULL
2009-04-17      1       3
2009-04-18      NULL    2
2009-04-19      NULL    4
2009-04-20      4       NULL
2009-04-21      3       6

A lényeg, hogy mindkét oldalon lehetnek NULL-ok.
Ezekkel próbálkoztam sikertelenül:

select * from
  (select date(`time`) 'date', count(*) 'table1' from `table1` group by date(`time`)) t1
[left|right|left outer|natural|...] join
  (select date(`time`) 'date', count(*) 'table2' from `table2` group by date(`time`)) t2
using (date)
order by date;
Tehát a kérdés az hogy hogyan lehetne a két lekérdezést szimmetrikusan összekapcsolni, illetve van-e más lehetőség a megvalósításra?
 
1

Szerintem ez működik

tisch.david · 2009. Május. 1. (P), 23.26
Kedves jaczkog!

Hirtelen a következő megoldást találtam:

SELECT *
FROM (
  SELECT datum d1, count(*) c1
  FROM tabla t1
  GROUP BY datum
  ORDER BY datum
) a1
  LEFT JOIN (
    SELECT datum d2, count(*) c2
    FROM tabla2 t2
    GROUP BY datum
    ORDER BY datum
  ) a2
  ON a2.d2 = a1.d1
Szerintem ez megoldja a feladatot, de ha nem, akkor szólj, és szívesen gondolkozom még rajta.

Üdv:

Dávid
2

Sajnos nem

jaczkog · 2009. Május. 2. (Szo), 09.38
Sajnos ezzel is próbálkoztam már, de mivel (a fenti példával élve) a table1-ben nincs 2009-04-18 dátum, ezért azokat a table2-ből sem adja vissza a lekérdezés.
3

union

Szekeres Gergő · 2009. Május. 2. (Szo), 10.35

SELECT 
    union_table.cts,
    COUNT(table1.t1_timestamp) as table1_ts_count,
    COUNT(table2.t2_timestamp) as table2_ts_count
FROM 
((SELECT t1_timestamp as cts FROM `table1`)
UNION 
( 
SELECT t2_timestamp as cts2 FROM `table2`
)) as union_table
LEFT JOIN table1 ON table1.t1_timestamp = union_table.cts
LEFT JOIN table2 ON table2.t2_timestamp = union_table.cts
GROUP BY union_table.cts
azért teszteld le nagyobb adatmennyiségnél is, lehet két lekérdezéssel jobban jársz.
4

sajnos ez sem...

jaczkog · 2009. Május. 4. (H), 12.14
Értem az ötletet, de ha mindkét táblában vannak az adott naphoz értékek, akkor mindent hozzárendel mindenhez így a mennyiségek összeszorzódnak.

Végül ezen ötleten elindulva jutottam el ide:

select date_union.`date`, `t1_count`, `t2_count`
from
  ((select date(`time`) `date` from `table1`)
  union
  (select date(`time`) `date` from `table2`)
  order by `date`) date_union
left join
  (select date(`time`) `date`, count(*) 't1_count' from `table1` group by date(`time`)) t1
  on date_union.`date`=t1.`date`
left join
  (select date(`time`) `date`, count(*) 't2_count' from `table2` group by date(`time`)) t2
  on date_union.`date`=t2.`date`
;
Nagy adatmennyiségen tesztelve kb. másfélszer lassabb, mint az eredeti aszimmetrikus lekérdezés, de nagyon ritkán lesz használva, így belefér ennyi.

Mindenkinek köszönöm a segítséget.