MYSQL query help

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

v keri tabeli so novice?

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.news
id = c.newsid
AND n.comment
id = 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.

Hvala, bom tako naredil in v kratkem poročam.

LP