MYSQL query help
4 naročniki
4 naročniki
Lepo pozdravljeni!
$table_name = "comment";
id (INT) | news_id (INT) | comment (TEXT) | datum (DATETIME)
Rad bi dobil vse news_id-je, urejene po datumu zadnjega komentarja.
Uglavnem, rad bi izpisal novice, tako, da bo novica z najbolj svežim komentarjem na vrhu in novica z drugim najbolj svežim komentarjem na 2. mestu itd....
p.s. manjka smajli, ki z glavo buta v steno
19 odgovorov
SELECT
id,
(SELECT MAX(datum) FROM comments WHERE news_id = news.id) AS maxdatum
FROM
news
ORDER BY
maxdatum DESC;
Nekaj v tem stilu, ampak se zavedaj, da je to blazno neelegantna in pocasna resitev. Vsekakor malo prestudiraj tukaj indekse, o podobni temi (uporaba MAX() v kombinaciji z indeksi) sem pred kratkim pisal na mojem blogu.
Bi ti pa vsekakor svetoval, da razmisljas malo o kaksni reduncanci podatka o datumu zadnjega komentarja v tabeli novic. Zadevo lahko resis tudi tako, da se samodejno azurira, poglej si malo triggerje.
kaj pa tkole...
SELECT * FROM news AS n LEFT JOIN comment AS c ON (n.newsid=c.newsid) ORDER BY c.datum DESC LIMIT 10
sevede po predpostavki, da je tabela z novicami: "news" in, da je index: "news_id"
twarlock, tole pomoje zanj ni uporabno. Kaj lahko se zgodi, da ima le ena novica zadnjih deset komentarjev, torej bo rezultat te poizvedbe 10 enakih novic. Ce sem fanta prav razumel, ravno tega noce...
eh ja zabluzu blush
bom tvoj query mal popravu...
SELECT c.news_id
FROM
news AS n,
coment AS c
WHERE
(c.news_id=n.news_id)
GROUP BY c.news_id
ORDER BY MAX(c.datum) DESC
LIMIT 10
Ja, vsekakor, tole bi tudi delovalo. Je pa v obeh primerih query lahko blazno pocasen, sploh ob veliki kolicini podatkov, seveda. Nekako se vedno priporocam resitev z zapisovanjem podatka o datumu zadnjega kometarja v tabelo novic.
Super!! Uporabil sem twarlock-ovo rešitev in deluje. Komentarjev je zaenkrat še malo, tako da zaenkrat deluje hitro. Se pa strinjam da lahko zadeva postane požrešna in počasna.
Vini: Hvala za nasvet, si bom pogledal triggerje. Če pravilno razumem je to neke vrste procedura, ki se izvede ob vpisu vsakega komentarja in sicer zapiše id zadnjega komentarja v tabelo novic. Potemtakem bi bil query lepši, če bi novica imela 'id' zadnjega komentarja
SELECT n.newsid FROM news AS n, comments AS c
WHERE n.newsid = c.newsid
AND n.commentid = c.comment_id
ORDER BY c.datum DESC
LP
blackmamba, tako je, na tabelah lahko dolocis triggerje, ki se izvedejo pred/po insertu, updatu ali deletu. Za tovrsten query bi ti vsekakor svetoval, da si v tabelo novic zapisujes datum zadnjega komentarja, ker bos lahko tabelo po tem podatku tudi indeksiral in tako omogocil queryju, da za sortiranje podatkov uporabi indeks, kar je hitreje kot uporaba filesorta. Da se ne ponavljam, o tem sem pisal na blogu, pa si rajsi kar tam preberi podrobno razlago. Povezava na objavo je v mojem prvem odgovoru v tem threadu.