ugrás a tartalomhoz

két COUNT értéke összeszorzódik

mhn · 2009. Ápr. 14. (K), 11.52
sziasztok!

van egy banner-em. erről 2 statisztikát vezetek. egyik, h hányszor jelent meg a másik, h hányszor kattintottak rá.
a banner_id egyenlőre 1 mindenhol, mert még csak 1 van "beüzemelve"
banner_impress tábla:
id, banner_id, timestamp


banner_click tábla:
id, banner_id, timestamp

olyan lekérdezést szeretnék, ami napok szerint csoportosítva kiadja a megjelenés és a kattintások számát
tehát a végeredményben ez szerepel:
banner_id COUNT(impress) COUNT(click) Dátum

így próbáltam:
  1. SELECT COUNT(i.banner_id) as count_i,  
  2.        COUNT(c.banner_id) as count_c,  
  3.        FROM_UNIXTIME(i.timestampas datum   
  4.        FROM banner_impress i  
  5.        LEFT JOIN banner_click c  
  6.        ON DAYOFMONTH(FROM_UNIXTIME(i.timestamp))=DAYOFMONTH(FROM_UNIXTIME(c.timestamp))  
  7.        GROUP BY DAYOFYEAR(FROM_UNIXTIME(i.timestamp));  
viszont így a COUNT(impress) oszlopoban a két COUNT szorzata jelenik meg ha a COUNT(click) nem nulla, egyébként meg a valós érték
a COUNT(click)-ben meg ugyanaz mint a másik COUNT-ban vagy 0.


itt láttam ehhez hasonló problémát de nem sikerült a sajátommal boldogulni:

http://weblabor.hu/forumok/temak/100873


szval ezt az összeszorzást hogy lehetne kiküszöbölni?

előre is köszönöm!
 
1

Ilyesmi?

Poetro · 2009. Ápr. 14. (K), 12.49
  1. SELECT SUM(c.banner_id IS NOT NULL ) as count_i,    
  2.        SUM(c.banner_id IS NOT NULLas count_c,    
  3.        FROM_UNIXTIME(i.timestampas datum     
  4.        FROM banner_impress i    
  5.        LEFT JOIN banner_click c    
  6.        ON i.banner_id = c.banner_id    
  7.        GROUP BY DAYOFYEAR(FROM_UNIXTIME(i.timestamp));    
2

ez sajnos nem jó, még nagyobb

mhn · 2009. Ápr. 14. (K), 13.21
ez sajnos nem jó, még nagyobb értékek jönnek ki.
ez a SUM(c.banner_id IS NOT NULL ) összeadja a banner_id értékeit, gondolom.
de ez a szummázás csak addig lehet jó, amíg a banner_id 1, viszont később lesz máshol másfajta banner, aminek nem 1 lesz az id-ja
3

Nem jól gondolod

Poetro · 2009. Ápr. 14. (K), 13.33
Gondolom nem tudod, mit ad vissza az IS NOT NULL. Ha az ertek NULL akkor 0-t egyebkent 1-et.

Próbáld meg a két lekérdezésed külön-külön kiadni, és megnézni, hogy ott milyen értékeket ad, hogy ellenőrízd a számítás helyességét.
4

először is bocs, tényleg nem

mhn · 2009. Ápr. 14. (K), 14.23
először is bocs, tényleg nem tudtam mit ad vissza az IS NOT NULL. szval hülyeséget írtam...
viszont kipróbáltam:
  1. SELECT SUM(i.banner_id IS NOT NULL ) as count_i,      
  2.        FROM_UNIXTIME(i.timestampas datum       
  3.        FROM banner_impress i      
  4.        GROUP BY DAYOFYEAR(FROM_UNIXTIME(i.timestamp));   
count_i dátum
317 | 2009-03-26 13:41:02
506 | 2009-03-27 00:01:48
289 | 2009-03-28 00:04:14
  1. SELECT SUM(c.banner_id IS NOT NULL ) as count_c,      
  2.        FROM_UNIXTIME(c.timestampas datum       
  3.        FROM banner_impress c      
  4.        GROUP BY DAYOFYEAR(FROM_UNIXTIME(c.timestamp));   
count_c dátum
3 | 2009-03-27 14:53:00
2 | 2009-03-28 20:01:56

az általad írt verziót lefuttatva:

count_i count_c dátum
7291 | 7291 | 2009-03-26 13:41:02
11638 | 11638 | 2009-03-27 00:01:48
6647 | 6647 | 2009-03-28 00:04:14

az én első verzióm a COUNT-al:

count_i count_c dátum
317 | 0 | 2009-03-26 13:41:02
1518 | 1518 | 2009-03-27 00:01:48
578 | 578 | 2009-03-28 00:04:14

szval az én verziómban látszik, h összeszorzódnak a count oszlopok
az általad írt verzióban viszont nem látom, h hogy jöttek ki a számok

mindenesetre próbálkozok tovább
5

ránézésre jó :)

mhn · 2009. Ápr. 14. (K), 16.58
no egy ilyen megoldást sikerült összehozni:
  1. SELECT FROM_UNIXTIME(i.timestamp,'%Y. %m. %d.'as datum,  
  2.        COUNT(banner_id) as count_i,  
  3.        count_c   
  4.        FROM banner_impress i  
  5.        LEFT JOIN (    
  6.               SELECT count(banner_id) as count_c,  
  7.                      DAYOFYEAR(FROM_UNIXTIME(timestamp)),  
  8.                      timestamp   
  9.               from banner_click  
  10.                 GROUP BY DAYOFYEAR(FROM_UNIXTIME(timestamp))  
  11.        ) c   
  12.        ON DAYOFYEAR(FROM_UNIXTIME(i.timestamp))=DAYOFYEAR(FROM_UNIXTIME(c.timestamp))   
  13.        GROUP BY DAYOFYEAR(FROM_UNIXTIME(i.timestamp));  
viszont ezt annyiban módosítottam végül, hogy az egész lekérdezés eredményéből csináltam egy temporary táblát, mert egy drupal pager_query kapta meg ezt a lekérdezést, és sehogy se sikerült a countqueryt előállítani...
6

union

tgr · 2009. Ápr. 15. (Sze), 12.14
  1. SELECT sum(is_click IS NULLAS count_i,  
  2.        sum(is_click IS NOT NULLAS count_c  
  3. FROM (SELECT banner_id, timestampNULL AS is_click FROM banner_impress)  
  4.      UNION (SELECT banner_id, timestampTRUE AS is_click FROM banner_click)  
  5. GROUP BY DAYOFYEAR(FROM_UNIXTIME(timestamp));