Pereiti prie turinio

Kategorijų atvaizdavimas pagal naujausius straipsnius


Rekomenduojami pranešimai

Sveiki,

 

reikia atvaizduoti naujienų kategorijas su 5 naujausiomis naujienomis rūšiuojant pagal naujienos datą.

 

Pvz.: Naujausia naujiena yra Test10 ir ji pridėta į kategoriją Cat4. Kiek senesnė naujiena Test9 ir ji yra kategorijoje Cat7. Dar senesnė naujiena yra Test8 ir ji yra ketegorijoje Cat1. Man reikia, kad viršuje būtų kategorija Cat4 ir joje 5 naujausi straipsniai. Toliau po ja eitų kategorija Cat7 ir joje taip pat 5 šios kategorijos straipsniai ir t.t. Pridėjus naujieną Test11 į kategoriją Cat1, ši kategorija atsidurtų viršuje, o toliau eitų Cat4, Cat7. Na manau supratot, ko būtent noriu.

 

Taigi, kaip parašyti tokią SQL užklausą?

Naujienos lentelėje yra ID, Title, Category, Date.

Kategorijos lentelėje yra ID, Title.

Jos surištos taip: kategorijos ID su naujienos Category laukeliu.

(Žinoma pas mane duombazė žymiai didesnė, čia tik pateikiu pavyzdį.)

 

Ačiū.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

jei nemoki pasidaryti SQL tai imi lengviausią metodą:

 

imi visas kategorijas, susidedi jas į masyvą ir prasuki ciklą:

 

foreach($categories_array as $row):

endforeach;

 

ciklo viduje trauki 5 naujausius įrašus iš DB naujienų lentelės su ta kategorija ir orderinant pagal laiką.

 

SELECT * FROM `db` WHERE category = $row['cat_id'] ORDER BY date DESC LIMIT 5

 

nu ir turi tai ko tau reik. Aišku darai tai su kintamuoju:

 

$categories .= 'visas reikalas';

 

nes kaip žinia tai reiškia sudėtį. Aišku pasirašyti SQL užklausą lengviau, bet reik mokėti tai padaryti.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Visų pirmą, visąlaik reikia stengtis, kad užklausos nebūtų įkištos į ciklą. Ypač sudėtingos. O jeigu vis gi taip atsitinka, tai būtinai reikia cache'uoti rezultatą. Aišku, jeigu duombazė nėra didelė, labai to nepasijaus, bet vis gi, reikia laikytis gerų praktikų.

 

Ką reikia padaryti, tai iš pradžių reikia gauti kategorijų sąrašą, išrušiuotą pagal paskutines jose parašytas naujienas (t.y. jų datas). Gio, lenta "category" neturi field'o date.

 

SELECT C.id, C.title, MAX(N.create_date) AS last_new_date FROM categories C
JOIN news N ON N.category_id = C.id
GROUP BY C.id
ORDER BY N.create_date DESC

 

Paimi didžiausią reikšmę grupėje su MAX(), o grupuoji pagal kategorijas. Gaunasi sąrašas kategorijų, išrušiuotas nuo kategorijos, kurioje buvo naujausia naujiena, iki tos, kurioje buvo seniausia naujiena. Na ir tada jau iteruoji per rezultatą ir gauni kiekvienos kategorijos naujienas, kurias rušiuoji irgi pagal datą nuo naujausios iki seniausios. Jeigu kažkas nesigauna - rodyk kodą, pataisysim :)

 

P.S. Jeigu tau reikia parodyti tik tų paskutinių naujienų TOP 5 pavadinimus, tai galima tada panaudoti ir CONCAT() SQL'inį. O jeigu reikia kažkokį HTML formuot specifiškesnį, tada vis gi geriau tą daryti ne iš MySQL pusės.

Redagavo vitalikaz
Nuoroda į pranešimą
Dalintis kituose puslapiuose

SELECT C.cat_id, C.cat_title, MAX(N.new_date) AS last_new_date 
FROM newsCategories C 
LEFT JOIN news N ON N.new_category = C.cat_id 
GROUP BY C.cat_id 
ORDER BY N.new_date DESC

 

na su šituo dabar lyg viskas ir okey. naujienų atvaizdavimas bus su html, kažkas panašaus į delfi. kaip suprantu, dabar viduje ciklo sukti dar vieną ciklą ir į jį krauti naujienas?

 

edit: nors ne, nesurūšiuoja pagal datą jų...

Redagavo Donatis07
Nuoroda į pranešimą
Dalintis kituose puslapiuose

SELECT 
C.cat_id, C.cat_title, MAX(N.new_date) AS last_new_date
FROM newsCategories C
LEFT JOIN news N ON N.new_category = C.cat_id
WHERE N.new_online = 1 AND C.cat_online=1
GROUP BY C.cat_id
ORDER BY N.new_date DESC

 

cat_id | cat_title | last_new_date

9 | Mokslas ir IT | 2014-01-06 02:05:00

1 | Sportas | 2014-01-03 02:00:50

3 | Kriminalai | 2014-01-03 02:00:40

7 | Laisvalaikis | 2014-01-03 02:01:00

5 | Savivaldybės žinios | 2014-01-06 02:04:00

2 | Kultūra | 2013-12-31 02:00:00

8 | Žmonės | 2014-01-03 02:03:00

6 | Verslas | 2014-01-02 02:00:10

4 | Aktualijos | 2014-01-03 02:02:00

 

na ir kaip matot, rezultatas grąžinamas neteisingas... :|

 

Edit: klaida buvo ORDER BY. pakeičiau į ORDER BY last_new_date DESC ir kategorijas sudeda teisingai.

 

tai kaip dabar tas naujienas sudėt?

<?php 
$ncatSQL = "SELECT 
				C.cat_id, C.cat_title, MAX(N.new_date) AS last_new_date
			FROM newsCategories C
			JOIN news N ON N.new_category = C.cat_id
			WHERE N.new_online = 1 AND C.cat_online=1
			GROUP BY C.cat_id
			ORDER BY last_new_date DESC";
$articleCat = $db->db_query($ncatSQL);
if ($db->db_rows($articleCat) > 0) {
	while($article = $db->db_array($articleCat)) {
?>
<div class="full-left-box">
	<h2 class="thetitle font-replace"><?=$article["cat_title"]?></h2>
	<div class="title-top">
		<a href="/naujienos/<?=$article["cat_url"]?>">peržiūrėti daugiau straipsnių kategorijoje</a>
	</div>
	<div class="category-block">
		<?//=$article["new_title"];?>
	</div>
</div>
<?php
	}
}
?>

čia tik testuojamas kodas, tad nei pdo yra ir viskas į krūvą sudėta - php ir html...

Redagavo Donatis07
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...