Autor Zpráva
Marek Žouželka
Profil *
Dělám si takové menší forum, mám dvě tabulky: categories a topics a celé to funguje nějak takto: Když je vybrána kategorie tak vypíšu topics kde cat_id je rovno zvolené kategorii. Když je vybráno jedno z témat, vypíšu všechny topics, kde parent je rovno id zvoléného tématu.
Vím, že ten návrh db není nejideálnější, ale už to nějakej pátek funguje skvěle. Teď je ale problém: Chci aby se topics vybrané kategorie řadili podle data těch podřazených topics. Jak na to?
Doufam, že jsem to popsal tak nějak srozumitelně :-) Děkuji za odpovědi...
Kajman
Profil
V současném dotaze uděláte ještě jeden left join na tu samou tabulku topics (s jiným aliasem) s podmínkou že parent=topic_id, zgroupujete to a seřadíte podle max() nad sloupcem s datumem.

Ale nepočítejte s tím, že by to bylo nad více daty svižné.
juriad
Profil
TABLE topics:
id: INT
cat_id: INT
parent_id: INT
added: DATE

SELECT t1.*, MAX(t2.added) as last_added
FROM topics t1 LEFT JOIN topics t2 ON (t2.parent_id = t1.id OR t2.id = t1.id)
 -- je nutne sjoinovat i sam se sebou: pokud by nemel potomky, nemel by ani last_added
GROUP BY t1.id
WHERE t1.cat_id = $category
ORDER BY last_added
Marek Žouželka
Profil *
Díky za odpovědi! Vyzkouším a dám vědět :-)


ať se snažím, jak se nažím, nemůžu to dát dohromady...

když vyjdu z příspěvku juriada s tím, že tabukka vypadá takle:
id: INT
category: INT
parent: INT
date: DATETIME

tak upravím dotaz následovně:
SELECT t1.*, MAX(t2.date) as last_added
FROM topics t1 LEFT JOIN topics t2 ON (t2.parent = t1.id OR t2.id = t1.id)
GROUP BY t1.id
WHERE t1.category = $category
ORDER BY last_added

a nefunguje to... kde dělám chybu? Díky moc ;-)


nefunguje tak, že vypisuje chybu 1064...
peta
Profil
http://www.dpriver.com/pp/sqlformat.htm
select Mysql, tlacitko Format
t1(4,7) expected token:; ASC DESC ) , HAVING ORDER UNION MINUS INTERSECT
Dotaz od juriad hlasi uplne stejnou chybu.

http://localhost/phpmyadmin/
Kdyz vytvorim v phpmyadminu tabulku a dam tam sql dotaz, tak pise:
#1064 - 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 'WHERE t1.category = 123 ORDER BY last_added LIMIT 0, 30' at line 4
To je dulezite uvest, chybovou hlasku a ne jen cislo chyby.

Protoze se to pise opacne. Nejdriv pouzivas where a pak az grupujes, ze jo, logicke.
SELECT t1 . * , MAX( t2.date ) AS last_added
FROM topics t1
LEFT JOIN topics t2 ON ( t2.parent = t1.id
OR t2.id = t1.id )
WHERE t1.category =123
GROUP BY t1.id
ORDER BY last_added
LIMIT 0 , 30

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: