SQL: Nejdiskutovanejsi clanky

Pavol Obecajcik Pavol.Obecajcik na onatix.com
Neděle Listopad 3 02:05:12 CET 2002


Zdravim,

> 
> Mam tabulku s diskusema ke clanku, pro prehlednost zjednodusim:
>   diskuse (diskuse_id, clanek_id, datum, text)

 Ak som spravne pochopil tak diskuse_id, clanek_id je kompozitny
primarny kluc.
 Uvazujem, ze diskuse_id je poradove diskusne cislo k clanku.
 
> 
>     SELECT diskuse.clanek_id, 
>     COUNT(diskuse.clanek_id) AS celkovy_pocet
>     COUNT(posledni_tyden.diskuse_id) AS posledni_pocet
>     FROM diskuse, diskuse AS posledni_tyden
>     WHERE diskuse.clanek_id=posledni_tyden.clanek_id
>     AND posledni_tyden.datum>'".Date("Y-m-d H:i:s", Time()-(7*24*3600))."' 
>     GROUP BY diskuse.clanek_id
>     ORDER BY posledni_pocet DESC, celkovy_pocet DESC, 
>     LIMIT 5;
> 

> To mi vsak hazi nejake vysoke pocty -- napriklad ackoliv 
> kdyz bych predpokladal, ze by melo byt celkovy_pocet=20
> a posledni_pocet=3, tak mi to vraci jakoby jejich nasobek,
> tedy celkovy_pocet = posledni_pocet = 60.

  Presne tak vrati to nasobok, lebo vznikne kartezky sucin medzi
jednotlivymi vybermi. Chyba je v tom, ze pouzivas alias iba jeden krat
- potom je otazne z ktorej tabulky (vyberu) ma zobrat hodnotu a tiez
neprepajes cez jednoznacny identifikator, ktory tvory dvojica
(clanek_id, diskuse_id).

K veci: Skus toto - Select je napisany pre interbase, lebo mySQL nemam
a chcel som to odskusat. Takze si to prepis pre mySQL, lebo neviem
presne syntax pre outer join a za ? dosad vyraz pre vypocet datumu.

SELECT
   vsetky.clanek_id,
   COUNT(vsetky.clanek_id) AS celkovy_pocet,
   COUNT(posledni_tyden.clanek_id) AS posledni_pocet
 FROM
   diskuse vsetky
      left outer join
   diskuse posledni_tyden
      on 
        vsetky.clanek_id=posledni_tyden.clanek_id
        and vsetky.diskuse_id=posledni_tyden.diskuse_id
        and posledni_tyden.datum > ?
GROUP BY vsetky.clanek_id
ORDER BY 3 DESC, 2 DESC

Neviem, ci som pochopil spravne tvoj problem, ale dufam, ze Ti to aj
tak pomoze.

Palo


Další informace o konferenci Test