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:
  1. select * from  
  2.   (select date(`time`) 'date'count(*) 'table1' from `table1` group by date(`time`)) t1  
  3. [left|right|left outer|natural|...] join  
  4.   (select date(`time`) 'date'count(*) 'table2' from `table2` group by date(`time`)) t2  
  5. using (date)  
  6. 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:
  1. SELECT *  
  2. FROM (  
  3.   SELECT datum d1, count(*) c1  
  4.   FROM tabla t1  
  5.   GROUP BY datum  
  6.   ORDER BY datum  
  7. ) a1  
  8.   LEFT JOIN (  
  9.     SELECT datum d2, count(*) c2  
  10.     FROM tabla2 t2  
  11.     GROUP BY datum  
  12.     ORDER BY datum  
  13.   ) a2  
  14.   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
  1. SELECT   
  2.     union_table.cts,  
  3.     COUNT(table1.t1_timestamp) as table1_ts_count,  
  4.     COUNT(table2.t2_timestamp) as table2_ts_count  
  5. FROM   
  6. ((SELECT t1_timestamp as cts FROM `table1`)  
  7. UNION   
  8. (   
  9. SELECT t2_timestamp as cts2 FROM `table2`  
  10. )) as union_table  
  11. LEFT JOIN table1 ON table1.t1_timestamp = union_table.cts  
  12. LEFT JOIN table2 ON table2.t2_timestamp = union_table.cts  
  13. 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:
  1. select date_union.`date`, `t1_count`, `t2_count`  
  2. from  
  3.   ((select date(`time`) `datefrom `table1`)  
  4.   union  
  5.   (select date(`time`) `datefrom `table2`)  
  6.   order by `date`) date_union  
  7. left join  
  8.   (select date(`time`) `date`, count(*) 't1_count' from `table1` group by date(`time`)) t1  
  9.   on date_union.`date`=t1.`date`  
  10. left join  
  11.   (select date(`time`) `date`, count(*) 't2_count' from `table2` group by date(`time`)) t2  
  12.   on date_union.`date`=t2.`date`  
  13. ;  
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.