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:

SELECT COUNT(i.banner_id) as count_i,
       COUNT(c.banner_id) as count_c,
       FROM_UNIXTIME(i.timestamp) as datum 
       FROM banner_impress i
       LEFT JOIN banner_click c
       ON DAYOFMONTH(FROM_UNIXTIME(i.timestamp))=DAYOFMONTH(FROM_UNIXTIME(c.timestamp))
       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
SELECT SUM(c.banner_id IS NOT NULL ) as count_i,  
       SUM(c.banner_id IS NOT NULL) as count_c,  
       FROM_UNIXTIME(i.timestamp) as datum   
       FROM banner_impress i  
       LEFT JOIN banner_click c  
       ON i.banner_id = c.banner_id  
       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:

SELECT SUM(i.banner_id IS NOT NULL ) as count_i,    
       FROM_UNIXTIME(i.timestamp) as datum     
       FROM banner_impress i    
       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

SELECT SUM(c.banner_id IS NOT NULL ) as count_c,    
       FROM_UNIXTIME(c.timestamp) as datum     
       FROM banner_impress c    
       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:

SELECT FROM_UNIXTIME(i.timestamp,'%Y. %m. %d.') as datum,
       COUNT(banner_id) as count_i,
       count_c 
       FROM banner_impress i
       LEFT JOIN (  
              SELECT count(banner_id) as count_c,
                     DAYOFYEAR(FROM_UNIXTIME(timestamp)),
                     timestamp 
              from banner_click
                GROUP BY DAYOFYEAR(FROM_UNIXTIME(timestamp))
       ) c 
       ON DAYOFYEAR(FROM_UNIXTIME(i.timestamp))=DAYOFYEAR(FROM_UNIXTIME(c.timestamp)) 
       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

SELECT sum(is_click IS NULL) AS count_i,
       sum(is_click IS NOT NULL) AS count_c
FROM (SELECT banner_id, timestamp, NULL AS is_click FROM banner_impress)
     UNION (SELECT banner_id, timestamp, TRUE AS is_click FROM banner_click)
GROUP BY DAYOFYEAR(FROM_UNIXTIME(timestamp));