Autor Zpráva
grimword
Profil
Mám tabulku o následující struktuře.

= pokud se jedná o nové téma, tak má vyplněný TITULEK a prázdné ID_REAKCE
= pokud jde o reakci, má prázdný TITULEK a v ID_REAKCE je ID originálního téma



A teď - jak mám udělat dotaz, který vypíše témata podle posledního příspěvku?
(aby témata byla řazena tak, kde je nejnovější reakce)
nemeja
Profil
tak v tabulce reakce si ukládáš čas, pak si vybereš záznam s posledním časem a k němu najdeš příspěvek :)
Tori
Profil
grimword:
Jaké hodnoty a z kterých řádků chcete najít?

* Řádky s ID 1 a 5 (v pořadí 5, 1) najdete joinem:
SELECT t1.* , MAX(t2.datum) 'razeni'
FROM tabulka t1
INNER JOIN tabulka t2 ON t1.id = t2.id_reakce
GROUP BY t1.id
ORDER BY razeni DESC
Předpokládám řazení podle datumu, ale klidně to MAX(datum) změňte na jiný sloupec.

* Řádky s ID 15, 14 najdete podobným dotazem, jako ve FAQ.

* anebo chcete něco mezi (titulek a id z řádků 5, 1, ale autor a datum z řádků 15, 14)?
grimword
Profil
Představte si hlavní stránku této diskuse. Zobrazují se thready (témata) bez vlivu na to, kdy které bylo založeno, ale podle toho kde je poslední příspěvek. Takže potřebuji vypsat všechny hlavní témata, ale řazené podle toho kde byl poslední příspěvek (poslední reakce).

Samozřejmě to nelze řadit jen podle poslední odpovědi v threadu, ale je potřeba zohlednit i nová témata bez reakcí.


Takže řešení podle mě:

1. procházet všechny řádky od nejvyššího ID (bez rozdílu jestli se jedná o reakci nebo hlavní téma)
2. pokaždé zkontrolovat jestli je již vypsané
3. pokud ne, tak tak zjistit jestli se jedná o reakci nebo hlavní téma
4. pokud téma - vypíšu jej
5. pokud reakce - najít hlavní téma a vypsat jej


6. od chvíle vypsání budou při dalším procházení ignorovány všechny reakce u tohoto téma i samotné hlavní téma
Sir Tom
Profil
grimword:
Je to špatný návrh databáze. Lepší je mít tabulku s tématy a tabulku s příspěvky. Pak stačí seřadit příspěvky podle času (ID) a přiřadit k nim téma. V současném stavu se asi bez nějakého pěkného poddotazu, nebo 2 dotazů (jeden v cyklu - jak píšeš) neobejdeš.
grimword
Profil
Pokud budeme počítat s touto strukturou tabulky, jak by dotaz vypadal?
Tori
Profil
grimword:
No a když si upravíte ten join, aby bral i prázdná témata?
SELECT t1.* , IFNULL(MAX(t2.id), t1.id) 'razeni'
FROM tabulka AS t1
LEFT JOIN tabulka AS t2 ON t1.id = t2.id_reakce
WHERE t1.id_reakce = 0
GROUP BY t1.id
ORDER BY razeni DESC

nové téma [...] má [...] prázdné ID_REAKCE
"Prázdné" znamená NULL nebo 0 nebo ""? Počítala jsem s tím, že tam je číslo nula - změňte si kdyžtak část where.
grimword
Profil
Nechápu tam jednu věc - použití JOIN? JOIN slouží ke spojení více tabulek, já to mám ovšem vše v jedné tabulce (hlavní témata i reakce).

Pokud to funguje i na jednu tabulku, co pak zastupuje označení t1 a t2 když ne názvy dvou tabulek?
Tori
Profil
Zvýraznila jsem, že jde pouze o jednu a tu samou tabulku. A jelikož ji spojuji samu se sebou, musí mít dva různé aliasy (t1, t2).
edit: klíčové slovo AS je nepovinné, aliasy lze uvádět hned za názvem tabulky, sloupce, či výrazem. "AS" se musí uvádět např. u SELECT 'hodnota' AS 'sloupec' FROM DUAL - jinak by byl výsledkem sloupec jménem "hodnota" s hodnotou "hodnotasloupec".
grimword
Profil
Tak jsem to právě nahodil na web, rozchodil a funguje naprosto bezvadně. Opravdu smekám před vašimi znalostmi.

Mockrát děkuji.

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: