Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: lista kategorii z ost. postem
Forum PHP.pl > Forum > Bazy danych
karis
musze naprawic listowanie kategorii na forum wraz z ostatnim tematem i ostatnim postem w nim

struktura tabel (kluczy do relacji) jest następująca:

categories:

id

topics:

id, category_id, created int(6) - zapisywany unixtimestamp

posts:

id, topic_id, `date` int (9) - tez unixtimestamp

musze pobrac:

liste kategorii wraz z ostatnią odpowiedzią w temacie (pobrać tu musze też nazwe tematu, autora tematu, autora ostatniej odpowiedzi)

potrzebuje to zrobic jak najwydajniej najlepiej jednym zaytaniem z joinami albo subselectami, prosze o porady bo juz sie mecze z tym 3 dni
nospor
Najlepiej jakbys poprawil strukture i w tabeli kategorii dodal ID ostatniego tematu
a w tabeli tematu dodal ID ostatniego posta. Wowczas wszystko zrobisz i wydajnie i bez problemu
karis
no moglbym tylko teraz zabawa z triggerami bedzie ładna, a przy obecnej strukturze? jakieś wskazówki?
nospor
Ale to bedzie najoptymalniejsze.

trigger albo w php
karis
triggery chyba odpadają w tej sytuacji bo dojdzie do rekurencji, kiedy przy AFTER UPDATE posts wykonam zapytanie update do post
nospor
Po update post masz robic update topic
po update topic masz robic update category

ps: widze ze nie masz tabeli tematow (topic)....... no wlasnie.... przydalaby sie wink.gif

ALbo czysty php, gdzie w php robisz update na tabelach w zaleznosci od akcji
mmmmmmm
Cytat(karis @ 12.11.2013, 14:39:40 ) *
triggery chyba odpadają w tej sytuacji bo dojdzie do rekurencji, kiedy przy AFTER UPDATE posts wykonam zapytanie update do post

Jeśli byś tak chciałbyś robić, to nie robisz UPDATE, tylko modyfikujesz NEW. I BEFORE, a nie AFTER.
karis
tak tylko co jesli chce kompleksowo wszystkie zaktyalizowac a nie tylko jeden?

poradzilem sobie na razie, że do innej tabeli przypisalem triggera
nospor
Cytat
tak tylko co jesli chce kompleksowo wszystkie zaktyalizowac a nie tylko jeden?

Przyklad dla topic - post
update topic t set ID_LAST_POST = (select ID from post where ID_TOPIC=t.ID order by CDATE desc limit 1);
karis
o triggery mam póki co załatwione teraz czeka mnie koszmar z przepisywaniem zapytania i struktury:

  1. SELECT *, count(comment_id) AS posts FROM (
  2. SELECT
  3. p.id AS sub_id, p.name AS sub_name, p.description AS sub_description, p.news_count AS sub_count, p.parent_id AS sub_parent_id,
  4. s.id, s.name, s.description,
  5. n.id AS news_id, n.title AS news_title, n.category_id AS ncat, s.position AS s_pos, p.position AS p_pos,
  6. c.id AS comment_id,
  7. IF(c.date IS NULL, FROM_UNIXTIME(n.created), IF(n.created > c.date, FROM_UNIXTIME(n.created), FROM_UNIXTIME(c.date))) AS topic_date,
  8. IF(c.author IS NULL, n.author, c.author) AS topic_author,
  9. IF(c.user_id IS NULL, n.user_id, c.user_id) AS topic_user_id
  10. FROM news_categories p
  11. INNER JOIN news_categories s ON p.parent_id = s.id
  12. LEFT JOIN news n ON (n.category_id = p.id AND n.active = 1)
  13. LEFT JOIN news_comments c ON (n.id = c.news_id AND c.active = 1)
  14. ORDER BY topic_date DESC
  15. ) AS tmp GROUP BY sub_id ORDER BY s_pos, p_pos


całość opiera się na newsach i komentarzach (jako forum) tutaj pobierane są kategorie wraz z subkategoriami i tematami i pozostalymi danymi

macie jakieś pomysły jak to przerobić? potem jest to dziwnie parsowane na tablicach w php
mmmmmmm
Kolejny, który do GROUP BY * używa...
Może napisać manuala pt. "Jak NIE grupować w MySQL-u?"
karis
po pierwsze to nie ja pisałem a skoro jesteś takim mądralą to zabłyśnij i napisz jak powinno wygladac to zapytanie
mmmmmmm
1. TY jesteś autorem tego posta. Nawet jeśli skądś to wkleiłeś, to nie napisałeś ską - nie mogłem wiedzieć że nie ty jesteś autorem.
2. Mógłbym napisać - dla mnie to nie problem. (popatrz sobie na inne moje posty na tym forum). Ale musiałbym wiedzieć, co to ma robić. Analizując samego SQL mogę się domyśleć, co to robi, ale nie co MA robić.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.