Autor | Zpráva | ||
---|---|---|---|
grimword Profil |
#1 · Zasláno: 18. 3. 2012, 04:40:02
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 |
#2 · Zasláno: 18. 3. 2012, 08:29:42
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 |
#3 · Zasláno: 18. 3. 2012, 09:16:28
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 * Řá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 |
#4 · Zasláno: 18. 3. 2012, 09:59:11 · Upravil/a: grimword
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 |
#5 · Zasláno: 18. 3. 2012, 10:25:18
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 |
#6 · Zasláno: 18. 3. 2012, 11:00:15
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 |
#8 · Zasláno: 18. 3. 2012, 12:35:00
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 |
#10 · Zasláno: 18. 3. 2012, 14:27:21
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. |
||
Časová prodleva: 12 let
|
0