| Autor | Zpráva | ||
|---|---|---|---|
| bagocina Profil * |
#1 · Zasláno: 25. 8. 2011, 21:27:23
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 |
#2 · Zasláno: 25. 8. 2011, 21:54:20
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 * |
#3 · Zasláno: 25. 8. 2011, 22:29:57
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 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 |
#4 · Zasláno: 26. 8. 2011, 00:04:08
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 |
||
| bagocina Profil |
#5 · Zasláno: 26. 8. 2011, 10:11:15
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 |
#6 · Zasláno: 26. 8. 2011, 10:27:38
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 |
#7 · Zasláno: 26. 8. 2011, 10:50:07
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 |
#8 · Zasláno: 26. 8. 2011, 11:11:46 · Upravil/a: Tori
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 |
#9 · Zasláno: 26. 8. 2011, 11:25:04
Druhý select funguje presne ako potrebujem. Ďakujem veľmi pekne za pomoc.
|
||
| bagocina Profil |
#10 · Zasláno: 27. 8. 2011, 00:06:50
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 |
#11 · Zasláno: 27. 8. 2011, 00:10:36 · Upravil/a: Tori
Jaj, aha. Tak pak asi COUNT(n.id). Mi nedošlo, že takhle to vlastně započítá i řádky z tabulky stranky.
|
||
| bagocina Profil |
#12 · Zasláno: 27. 8. 2011, 00:12:19
Ďakujem veľmi pekne.
|
||
|
Časová prodleva: 14 let
|
|||
0