řazení v news podle zhlédnutí – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

řazení v news podle zhlédnutí – PHP – Fórum – Programujte.comřazení v news podle zhlédnutí – PHP – Fórum – Programujte.com

 

Kvetos0
Newbie
22. 6. 2014   #1
-
0
-

Ahoj!

Na HomePage zobrazují 11 newsek. Zobrazují se podle datumu vložení a času takto:

$result = dbquery(
"SELECT tn.*, tc.*, tu.user_id, tu.user_name, tu.user_status
FROM ".DB_NEWS." tn
LEFT JOIN ".DB_USERS." tu ON tn.news_name=tu.user_id
LEFT JOIN ".DB_NEWS_CATS." tc ON tn.news_cat=tc.news_cat_id
WHERE ".groupaccess('news_visibility')." AND (news_start='0'||news_start<=".time().")
AND (news_end='0'||news_end>=".time().") AND news_draft='0'
GROUP BY news_id 
ORDER BY news_sticky DESC, news_datestamp DESC LIMIT ".$_GET['rowstart'].",".$items_per_page
);


Chtěl bych, aby se články/newsky řadily takto nadále, ale s tím, že se pro každý den seřadí podle počtu zhlédnutí, ostatní zůstane stejné. Upravil jsem (viz. poslední řádek) kód takto:

//Modification  - Kvetos, 20.06.2014
$result = dbquery(
"SELECT tn.*, tc.*, tu.user_id, tu.user_name, tu.user_status
FROM ".DB_NEWS." tn
LEFT JOIN ".DB_USERS." tu ON tn.news_name=tu.user_id
LEFT JOIN ".DB_NEWS_CATS." tc ON tn.news_cat=tc.news_cat_id
WHERE ".groupaccess('news_visibility')." AND (news_start='0'||news_start<=".time().")
AND (news_end='0'||news_end>=".time().") AND news_draft='0'
GROUP BY news_id
	ORDER BY news_sticky DESC, news_reads DESC LIMIT ".$_GET['rowstart'].",".$items_per_page
		);


Tato změna se projevila tak, že se u akituálního dne řadí články podle zhlédnutí reads od největšího počtu zhlédnutí ki nejmenšímu. Což je OK, tak to chci.

Avšak co je špatně, že se zároveň pod tím zobrazují všechny zbývající články z ostatních dnů (za poslední 2 roky) sestupně POUZE od největšího počtu zobrazení k nejnižšímu, bez sestupného řazení podle dnů.

Jak bych to měl vyřešit. Díky za každopu radu.

Nahlásit jako SPAM
IP: 188.175.48.–
Flowy0
Věrný člen
22. 6. 2014   #2
-
0
-

  1. ak chces pouzivat sql tak sa nauc alebo si aspon pozri co robia dane prikazy ktore pouzivas
  2. neprepisuj to druhe zoradenie ... order by funguje tak ze najprv tabulku zoradi podla posledneho potom zachova poradie a zoradi ju podla skorsieho atd az kym nenarazi na prve ... ty chces najprv zoradit podla reads potom podla datestamp a nakoniec dat sticky ako prve

Nahlásit jako SPAM
IP: 84.47.11.–
https://github.com/Flowy
Kvetos0
Newbie
23. 6. 2014   #3
-
0
-

#2 Flowy
Aha, takže jen prohodit. Rozumím.

Nahlásit jako SPAM
IP: 188.175.48.–
Kvetos0
Newbie
23. 6. 2014   #4
-
0
-

#2 Flowy
Tak jsem změnil ten poslední řádek na tohle:

 ORDER BY news_sticky DESC, news_datestamp DESC, news_reads DESC LIMIT ".$_GET['rowstart'].",".$items_per_page

1/ FUNGUJE, částečně!!!

2/ Ale ještě chybička, reads mi neřadí sestupně, tedy od nejčtenější newsky do nejméně čtené v každém dni.

3/ Pokud se neplatu, tak řazení se zadává přes groupaccess. Takže bych tam potřeboval propašovat asi:


WHERE ".groupaccess('news_visibility')." AND (news_start='0'||news_start<=".time().")
AND (news_end='0'||news_end>=".time().") AND news_draft='0'

Tedko  jsem zkoušel, nefunguje tato 2. změna; zobrazuje se vše, chybu nevypisuje..., ale neseřazuje...,  ještě to chce vylepšit, ale jak?

D.

Nahlásit jako SPAM
IP: 188.175.48.–
Kvetos0
Newbie
23. 6. 2014   #5
-
0
-

Tohle, tato mpje úprava nefunguje:

WHERE ".groupaccess('news_visibility')." AND ORDER BY news_datestamp DESC,AND (news_start='0'||news_start<=".time().")
AND (news_end='0'||news_end>=".time().") AND news_draft='0'

Celé to vypadá takto:

if ($rows) {
		$result = dbquery(
			"SELECT tn.*, tc.*, tu.user_id, tu.user_name, tu.user_status
			FROM ".DB_NEWS." tn
			LEFT JOIN ".DB_USERS." tu ON tn.news_name=tu.user_id
			LEFT JOIN ".DB_NEWS_CATS." tc ON tn.news_cat=tc.news_cat_id
	WHERE ".groupaccess('news_visibility')." AND ORDER BY news_datestamp DESC,AND (news_start='0'||news_start<=".time().")
				AND (news_end='0'||news_end>=".time().") AND news_draft='0'
			GROUP BY news_id
			ORDER BY news_sticky DESC, news_datestamp DESC, news_reads DESC LIMIT ".$_GET['rowstart'].",".$items_per_page
		);
		

Vypisuje chybu:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY news_datestamp DESC,AND (news_start='0'||news_start<=1403504812) AN' at line 5
 

Nahlásit jako SPAM
IP: 188.175.48.–
peter
~ Anonymní uživatel
4014 příspěvků
23. 6. 2014   #6
-
0
-

Jestli ti to funguje, tak ziram, protoze pouzivas konstrukce, ktere vubec neznam, coz ale mozne je, v sql jsem spis amater.
Ja bych to resil tak, ze si privne vyberu id clanku, ktere chci a dalsim selectem je teprve seradim. Cili neco jako 

SELECT sloupce
FROM (SELECT id FROM ... WHERE ... ORDER BY time DESC LIMIT 11)
LEFT JOIN ostatni tabulky...
ORDER BY pocet_precteni DESC
Nahlásit jako SPAM
IP: 2001:718:2601:258:7066:59...–
Kit+15
Guru
23. 6. 2014   #7
-
0
-

#6 peter
Však taky ty Kvetosovy konstrukce jsou pěkně zastaralé a nebezpečné.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
23. 6. 2014   #8
-
0
-

#5 Kvetos
Končí ti to chybou, protože máš AND před ORDER BY

Nahlásit jako SPAM
IP: 2a00:1028:83ac:345a:b95b:...–
Kvetos0
Newbie
23. 6. 2014   #9
-
0
-

Panové, dík za připomínky, pěkně se v tom placatím. Ale snad to vyřeším podle Vašich rad. Zatím díky.

Nahlásit jako SPAM
IP: 188.175.48.–
Flowy0
Věrný člen
25. 6. 2014   #10
-
0
-

#5 Kvetos
zoradovat tabulky pred joinom je zbytocne kedze joinom sa pravdepodobne aj tak neudrzi poradie ... moderny system by taketo stavy mal zakazat

a tiez by ti to v oracle vobec nepreslo pretoze order by MUSI byt vzdy na konci (okrem limit)

Nahlásit jako SPAM
IP: 91.148.1.–
https://github.com/Flowy
Kvetos0
Newbie
18. 9. 2014   #11
-
0
-

Dodatečně, díky. Zatím jsem tento kód nedokončil.

Nahlásit jako SPAM
IP: 188.175.48.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 61 hostů

Podobná vlákna

Řazení podle data — založil JMM

Řazení podle více sloupců — založil PetrCr

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý