Autor Zpráva
andynewcastleth
Profil


Vidíme, že #1 je hlavní příspěvek a #2 #3 #4 #5 #6 #7 #8 #9 jsou reakce.

Chci najít reakce, které nemají hlavní příspěvek (id_reakce má neexistující ID).

Nechci to ale dělat skrz while() uvnitř while() což bych dokázal, chci jeden SQL dotaz.
Tomášeek
Profil
andynewcastleth:
To by měl řešit left join s podmínkou na null, ne?
Keeehi
Profil
andynewcastleth:
SELECT
    *
FROM
    tabulka
WHERE
    id_reakce != '' AND
    id_reakce NOT IN (
        SELECT
            id
        FROM
            tabulka
    )    

Trochu mi dělá "starosti" ten sloupec id_reakce. To je to textový sloupec aby tam mohl být prázdný řetězec? Proč to není číselný nullable sloupec?
Pokud je číselný a jen NULL hodnoty takhle zobrazuje PMA tak bude třeba upravit tu první podmínku na IS NOT NULL.
andynewcastleth
Profil
id_reakce je TEXT, to jsem si ani nevšiml....


Jinak ten SQL dotaz funguje krásně. Děkuji.
lionel messi
Profil
andynewcastleth:

Trochu sa vzdialim od pôvodnej otázky. Ak je to možné, zamyslel by som sa nad databázovým návrhom.

Začal by som vyčlenením reakcií do samostatnej tabuľky (v praxi by sa určite hodilo vyčleniť do sólo tabuľky aj odosielateľov). To, čo chceš spraviť teraz, stále budeš môcť spraviť jediným SQL príkazom.

Mierne zdokonalená verzia tvojho návrhu by vyzerala takto:

Tabuľka hlavni_prispevky
id | titulek | url | text
1  | Prodám bouranou Ibizu | prodam-bouranou-ibizu-1 | Prodám ojeté auto.
2  | Koupím nebourané Audi | koupim-nebourane-audi-2 | Koupím krásné Audi Q5.

Tabuľka reakce

id_reakce | id_prispevku | odesilatel | text
1              | 1 | Michal K. | Dobrý den, měl bych zájem. Mohu se zeptat na cenu?
2              | 1 | Jana        | Zajímaly by mě fotky auta.
3              | 2 | Richard   | Hezký bourák!
4              | 3 | Dan Přibáň | Píšu z amazonské džungle. Do vlákna o trabantech jsem se ovšem asi netrefil.
5             | NULL | Niki Lauda | Das hat nicht geklappt! 

A SQL dotaz, ktorým by sa pri tomto návrhu dalo zistiť to, čo potrebuješ v [#1] by vyzeral takto:

SELECT * FROM hlavni_prispevky h RIGHT JOIN reakce r ON h.id = r.id_prispevku WHERE h.id IS NULL
Tomášeek
Profil
lionel messi:
A SQL dotaz, ktorým by sa pri tomto návrhu dalo zistiť to, čo potrebuješ v [#1] by vyzeral takto:
Ten dotaz může vypadat hodně podobně i při datech v jedné tabulce, bude se joinovat sama na sebe. Tak nějak jsem to zamýšlel svou odpovědí já.

Protože ale nejsem DB specialista, nedokážu bez vyzkoušení říci, jestli to bude rychlejší, než Keeehiho řešení. To bude chtít buď někoho, kdo to má více v oku, nebo to změřit.
andynewcastleth
Profil
Ano, mít vše v jedné tabulce není ideální. Ve skutečnosti je to ještě horší, neposlal jsem ani screenshot celé tabulky = obsahuje i další data. Jako např. počet shlédnutí konkrétních hlavních příspěvků atd.

Kdyby to bylo rozdělené na další tabulky, bylo by to lepší. Ale co nadělám, nebudu kvůli tomu přepisovat kompletně celý web.... .
Kcko
Profil
lionel messi:
Vazba rodic - dítě v jedné tabulce je IMHO zcela normální. Nevidím důvod proč by na to měl mít 2. To jestli tam mají smysl i další jiná data už je věc jiná.
Keeehi
Profil
Kcko:
Nevidím důvod proč by na to měl mít 2.
Protože to jsou sémanticky dvě rozdílné věci. Je to podobné jako články a komentáře. A ty taky nepatří do jedné tabulky. andynewcastleth tomu sice říká jinak ale vazba je to obdobná.
Kcko
Profil
Keeehi:
Moment, asi jsem nepochopil, ale jsou to komentáře s možností reakce ne? (Takže vazba rodič - dítě).
Keeehi
Profil
Kcko:
Ne screenshotu je jen jedna úroveň. Ale to je vedlejší, i kdyby to byly víceúrovňové komentáře tak to nic moc nemění.
Pro mě je hlavním ukazatelem na screenshotu to, že jsou tam téměř prázdné sloupce. Ta URL je pro mě taky silným vodítkem.

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:

0