Autor | Zpráva | ||
---|---|---|---|
SteveO Profil * |
#1 · Zasláno: 19. 12. 2012, 15:09:47
Dobrý den, prosím o pomoct s komplikovanějším SQL dotazem.
Potřebuji vypsat z databáze inzerátů 100 nejaktivnějších inzerentů (IP adres), a zároveň spočítat zvlášť počet aktivních a neaktivních inzerátů od daného inzerenta za poslední 3 měsíce a zvlášť počet aktivních a neaktivních inzerátů od daného inzerenta celkem. Následující kód je sice funkční, ale nedaří se mi do něj přidat seřazení od největšího počtu inzerátů po nejmenší. Jakmile přidám ORDER BY pocet2.aktivni2 DESC , server vyhodí chybu 500. Navíc takhle bych řadil jen podle počtu aktivních inzerátů, potřeboval bych řadit podle celkového počtu, tedy pocet2.aktivni2 + pocet2.neaktivni2.
SELECT inz.ip, pocet1.aktivni1, pocet1.neaktivni1, pocet2.aktivni2, pocet2.neaktivni2 FROM inzeraty AS inz LEFT JOIN (SELECT ip, COUNT(CASE WHEN aktivni=1 THEN 1 END) AS aktivni1, COUNT(CASE WHEN aktivni=0 THEN 1 END) AS neaktivni1 FROM inzeraty WHERE timestamp>=".(time()-7776000)." GROUP BY ip) AS pocet1 ON pocet1.ip=inz.ip LEFT JOIN (SELECT ip, COUNT(CASE WHEN aktivni=1 THEN 1 END) AS aktivni2, COUNT(CASE WHEN aktivni=0 THEN 1 END) AS neaktivni2 FROM inzeraty GROUP BY ip) AS pocet2 ON pocet2.ip=inz.ip LIMIT 100 Zároveň prosím o kontrolu kódu, zda je to takto vůbec správně... Díky moc! |
||
Kajman Profil |
#2 · Zasláno: 19. 12. 2012, 15:16:18
Zkuste si jen ten dotaz v nějakém databázovém nástroji. 500 asi vyplivne aplikace.
Třeba jen nedáváte order by před limit, kam patří, ale cpete ho nakonec. |
||
SteveO Profil * |
#3 · Zasláno: 19. 12. 2012, 15:25:30
Dotaz se neprovede ani přes PMA. ORDER samozřejmě dávám před LIMIT. Bez orderu to trvá půl sekundy, s ním nekonečně dlouho načítá a nakonec nic... :(
|
||
Kajman Profil |
#4 · Zasláno: 19. 12. 2012, 15:37:37
Zkuste dát order by a limit i dovnitř pocet2.
|
||
SteveO Profil * |
#5 · Zasláno: 19. 12. 2012, 16:16:14
To potom vybere všechny inzerenty a spočítá to prvních 100 inzerátů od každého z nich... ORDER a LIMIT musí být tam kde jsou teď... Už fakt nevím co s tím.
|
||
SteveO Profil * |
#6 · Zasláno: 19. 12. 2012, 21:55:12
Nikdo nic? :(
|
||
Kajman Profil |
Zkuste něco jako
SELECT v.ip, (SELECT Count(*) FROM inzeraty i WHERE i.ip = v.ip AND aktivni = 1 AND i.timestamp >= 1348176189) aktivni1, (SELECT Count(*) FROM inzeraty i WHERE i.ip = v.ip AND aktivni = 0 AND i.timestamp >= 1348176189) neaktivni1, (SELECT Count(*) FROM inzeraty i WHERE i.ip = v.ip AND aktivni = 1) aktivni2, (SELECT Count(*) FROM inzeraty i WHERE i.ip = v.ip AND aktivni = 0) naktivni2 FROM (SELECT ip, Count(*) vsech FROM inzeraty GROUP BY ip ORDER BY vsech DESC LIMIT 100) v ORDER BY v.vsech DESC |
||
Časová prodleva: 11 let
|
0