Autor Zpráva
bagocina
Profil *
Ahojte borci,

pracujem na alternatíve známeho počítadla TOPlist, s viacerými novými možnosťami a aj s tými ktoré sú v TOPlist Profi za poplatok (tie budú u mňa zdarma). Veľkú časť mám hotovú, len som sa zasekol pri vytváraní katalógu stránok.

Do databázy sa zapisujú do tabuľky navstevy všetky prístupy na danú stránku no len jeden za deň sa počíta ako návšteva, ostatné sú zobrazenia. To sa rozlišuje stĺpcom navsteva. Do neho sa zapisuje 0 ak ide len o zobrazenie a 1 ak ide o návštevu. Návštevy za deň vyberam select count s podmienkou pre dané id, daný dátum, a že sa v stĺpci navsteva nachádza 1.

V tabuľke stranky sú všetky registrované stránky s id, kategóriou (tá je zapisovaná ako číslo), názvom, url a pod.

Ja by som potreboval vytvoriť select, kde by bol zoznam stránok s výpisom názvu, ostatných maličkostí (tie by som hádam už aj sám zvládol vycucnúť) a ich následného zoradenia podľa priemeru návštevnosti za 7 dní. Čiže by sa spočítali riadky ktoré obsahujú v stĺpci navsteva 1 za posledných 7 dní a ten počet by sa vydelil siedmimi. Samozrejme group podla id stránok.

Jednoducho ako vidíte napríklad tu.

Ďakujem veľmi pekne za všetky tipy a rady, ktoré napíšete.
pcmanik
Profil
bagocina:
Ako ked som si to precital, dobre som sa zamotal :D, daj sem aspon strukturu tych dotycnych tabuliek, nech sa na to mozeme lepsie pozriet.
bagocina
Profil *
Je to ťažké vysvetliť :D Ale zasa spojazdniť by to nemal byť veľký problém len ja sa zamotám v selecte.

Tabuľka navstevy:
id (id stránky pre ktorú bola zaznamenaná návštevnosť/zobrazenie)
navsteva (zapisuje sa 0 alebo 1, ak ide o návštevu zapíše sa 1 ak už dnes návštevník viackrát navštívil daný web ide o zobrazenie, čiže 0)
ip
hostname
datum (iba dátum v tvare YYYY-MM-DD)
datum_cely (CURRENT_TIMESTAMP)
kod
... (dalej sú už nepodstatné veci o užívateľovi zistené z počítadla na stránke)

Tabuľka stranky:
id
kategoria (tá sa zapisuje ako číslo)
nazov
popis
url
heslo
mail
registrovany
skryta

Ja potrebujem spraviť výpis stránok, ktorý bude zoradený podľa priemeru návštevnosti za sedem dní. Tak ako to má spomínaný TOPlist.

Ešte raz spomeniem, že návštevnosť vyberám pomocou select count s podmienkou navsteva = '1'

Diki :)
Tori
Profil
bagocina:
Asi takového něco?
SELECT s.*, COUNT(*) 'pocetNavstev' FROM 
  (SELECT id FROM navstevy 
  WHERE navsteva = 1 AND datum < (CURDATE() - INTERVAL 1 WEEK)) n
  INNER JOIN stranky s ON n.id = s.id
  GROUP BY n.id 
  ORDER BY pocetNavstev
Dělení sedmi bych nechala na PHP, výsledky se seřadí stejně i bez něj.
bagocina
Profil
Select som vyskúšal a funguje iba z časti. V tabuľke stranky mam 6 stránok v rovnakej kategórii ale vypísalo mi len 3 a nejde mi do hlavy podľa čoho zistilo, že len tie 3 vyhovujú podmienkam.

Priemer v pohode funguje, tak už len vyriešiť aby to vypisovalo všetky stránky z tabuľky stranky.

Ale ďakujem pekne za tento select, pohrám sa s ním ešte, kým nedostane niekto ešte nejaký nápad.
Tori
Profil
bagocina:
Aha, asi chápu: Chcete zobrazit
* všechny stránky, a pokud byly v minulých 7 dnech navštívené, tak i průměr návštěv/den, anebo
* jen stránky, které byly v min. 7 dnech navštívené (to by měl dělat ten select)
?
bagocina
Profil
V selecte som dal naopak znamienko < pri stĺpci datum a select už robí takmer to, čo potrebujem.

Zobrazí všetky stránky rovnakej kategórie a zoradí ich podľa návštevnosti za posledný týždeň (v PHP už mám spravený priemer, čiže ich zoradí akoby podľa neho).

No ak nejaké stránky nemajú za posledných 7 dní žiadnu návštevnosť, tie nezobrazí. Ja potrebujem aby vypísalo aj tie, s tým, že budú na konci s priemerom 0.00.

Ďakujem
Tori
Profil
bagocina:
V selecte som dal naopak znamienko < pri stĺpci datum a select už robí takmer to, čo potrebujem.
Překlep, omlouvam se.

ak nejaké stránky nemajú za posledných 7 dní žiadnu návštevnosť, tie nezobrazí. Ja potrebujem aby vypísalo aj tie
SELECT s.*, COUNT(*) 'pocetNavstev'
  FROM stranky s
  LEFT JOIN navstevy n ON n.id = s.id AND navsteva = 1
  WHERE datum > (CURDATE() - INTERVAL 1 WEEK)
  GROUP BY n.id 
  ORDER BY pocetNavstev DESC

-- anebo takto: (zkuste EXPLAIN, co je výhodnější, já to neodhadnu)

SELECT s.*, COUNT(*) 'pocetNavstev'
  FROM stranky s
  LEFT JOIN (SELECT id FROM navstevy 
    WHERE datum > (CURDATE() - INTERVAL 1 WEEK) 
    AND navsteva = 1) n ON n.id = s.id 
  GROUP BY n.id 
  ORDER BY pocetNavstev DESC
bagocina
Profil
Druhý select funguje presne ako potrebujem. Ďakujem veľmi pekne za pomoc.
bagocina
Profil
Ešte som našiel jednu menšiu chybičku krásy.

Použil som kód:

SELECT s.*, COUNT(*) 'pocetNavstev'
FROM stranky s 
LEFT JOIN (SELECT * FROM navstevy 
WHERE datum > (CURDATE() - INTERVAL 1 WEEK) 
AND navsteva = '1') n ON n.id = s.id  WHERE kategoria = '$kategoria' 
GROUP BY s.id 
ORDER BY pocetNavstev DESC


(keď bolo v kóde GROUP BY n.id tak to zgrouplo stránky, ktoré nemajú žiadnu návštevnosť)

No ale je tu iný problém. COUNT v selecte pridelí stránkam, ktoré nemajú žiadnu návštevnosť číslo 1 a potom ich zoraďuje akoby mali návštevnosť 1, aj keď správne podľa priemeru nemajú žiadnu návštevnosť.


(v poslednom stĺpci je na ukážku výpis pocetNavstev)
(samozrejme tam mám ešte DATE_FORMAT, no teraz tam nie je, ale to je teraz nepodstatná vec)

Ďakujem za rady
Tori
Profil
Jaj, aha. Tak pak asi COUNT(n.id). Mi nedošlo, že takhle to vlastně započítá i řádky z tabulky stranky.
bagocina
Profil
Ďakujem veľmi pekne.

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:

0