Autor Zpráva
SteveO
Profil *
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
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 *
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
Zkuste dát order by a limit i dovnitř pocet2.
SteveO
Profil *
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 *
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
Nejlépe asi dopadne s vytvořeným společným indexem nad 3 sloupci (ip,aktivni,timestamp)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: