MySQL - podmíněný SELECT přes dvě tabulky

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #60 kdy: 07. 10. 2019, 00:18:42 »
O záznamu s hodnotou NULL jsem nikdy nemluvil, to jste si musel domyslet jako projekci Vašich myšlenek.
V tom případě to byl někdo jiný téhož jména.

NULL může reprezentovat implicitní nastavení

NULL je v takovýchto případech naprosto správná hodnota, od toho je.

Moje tvrzení se stále týkala výsledku JOINU. V implicitním nastavení nemáte patřičný záznam v tabulce tbl2 a tudíž se ve výsledku joinu objeví hodnota NULL. A je v takovém případě zcela na místě.

Chápu, měl jsem to napsat přesněji, tak příště.

Ale i kdyby: stále k tomu platí racchekovo zadání, že v tbl2 nemusí záznam existovat. A s tím si prostě v INNER JOINU neporadíte, na to nemá žádný vliv to, jestli v tabulce tbl2 ve sloupci allow může být NULL nebo ne.
« Poslední změna: 07. 10. 2019, 00:21:33 od Miroslav Šilhavý »


Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #61 kdy: 07. 10. 2019, 15:07:33 »
Moje tvrzení se stále týkala výsledku JOINU.
Pokud se chcete bavit o tom, jak se k výsledku dostat, těžko můžete začít od toho, co máte ve výsledku. Navíc jste psal o významu hodnoty NULL. Jenže u OUTER JOINu je význam hodnoty NULL doplněné místo neexistujících řádků jediný – výsledná sada záznamů musí v SQL obsahovat v každém řádku všechny sloupce, je tedy potřeba něco doplnit místo neexistujících řádků, a NULL je pro to vhodná hodnota.

Chápu, měl jsem to napsat přesněji, tak příště.
Díky.

Ale i kdyby: stále k tomu platí racchekovo zadání, že v tbl2 nemusí záznam existovat. A s tím si prostě v INNER JOINU neporadíte, na to nemá žádný vliv to, jestli v tabulce tbl2 ve sloupci allow může být NULL nebo ne.
Poradím si s tím snadno – když ty záznamy neexistují, asi nemají žádný význam, a je tedy v pořádku, že se do výsledné sady záznamů příslušný záznam vůbec nedostane. Všimněte si, že je to přesně to, co Racchek potřeboval, jak později napsal.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #62 kdy: 07. 10. 2019, 15:11:16 »
Poradím si s tím snadno – když ty záznamy neexistují, asi nemají žádný význam, a je tedy v pořádku, že se do výsledné sady záznamů příslušný záznam vůbec nedostane. Všimněte si, že je to přesně to, co Racchek potřeboval, jak později napsal.

To je velmi krátkozraké uvažování při návrhu selectu.
Racchek může ve své práci potřebovat následně vyselektovat třeba opak. Pokud to udělá OUTER JOINEM, jen vymění podmínku - což se hodí zejména ve scriptech.

Proto tvrdím, že pokud někdo navrhuje dotaz, měl by ho udělat co nejuniverzálnější. Následně se dá takový dotaz uložit jako VIEW a pak už vstoupí do hry jen to samotné WHERE.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #63 kdy: 07. 10. 2019, 15:57:11 »
To je velmi krátkozraké uvažování při návrhu selectu.
Racchek může ve své práci potřebovat následně vyselektovat třeba opak. Pokud to udělá OUTER JOINEM, jen vymění podmínku - což se hodí zejména ve scriptech.

Proto tvrdím, že pokud někdo navrhuje dotaz, měl by ho udělat co nejuniverzálnější. Následně se dá takový dotaz uložit jako VIEW a pak už vstoupí do hry jen to samotné WHERE.
Tohle je ukázkový příklad antipatternu „předčasná optimalizace“. Kód má být především správný, pak přehledný, srozumitelný a udržovatelný. Což v tomto případě znamená INNER JOIN, protože u něj to každý vidí na první pohled, že jde o INNER JOIN.

Navíc jste si bůhví proč vybral jako možnou modifikaci vybral zrovna ten jeden (nepravděpodobný) dotaz. Vzhledem k tomu, že v případě jediného zatím požadovaného dotazu je tam INNER JOIN, dá se předpokládat, že i případný „opačný“ dotaz bude zase INNER JOIN. Protože ty záznamy, pro které neexistuje podřízený záznam, jsou při spojení určitým způsobem nezajímavé, a budou nezajímavé pořád, ať se na ně díváte zleva nebo zprava. Takže v případě vytváření dalších dotazů tam pořád bude nutné přidávat tu podmínku pro INNER JOIN, pořád na to bude muset někdo myslet a hrozí, že ji přidá špatně. I pro další práci je tedy lepší mít ten INNER JOIN, protože tam je spojení tabulek pěkně definováno přímo u JOINu a do WHERE už se píšou jenom podmínky filtrující výslednou sadu. A pokud někdo náhodou bude potřebovat něco speciálního a tedy použít OUTER JOIN, holt si ten jeden příkaz napíše. Ostatně proto je zase vhodná syntaxe JOINu, kdy prostě jenom před klíčové slovo JOIN napíše LEFT nebo RIGHT a nemusí hledat mezi podmínkami ve WHERE, kde že je ta JOINovací podmínka vložená.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #64 kdy: 07. 10. 2019, 15:59:57 »
Tohle je ukázkový příklad antipatternu „předčasná optimalizace“. Kód má být především správný, pak přehledný, srozumitelný a udržovatelný. Což v tomto případě znamená INNER JOIN, protože u něj to každý vidí na první pohled, že jde o INNER JOIN.

To si nemyslím. Pro ladění je daleko výhodnější si vytvořit VIEW s LEFT OUTER JOINEM. Když si pak vyselektujete všechny záznamy, daleko líp si představíte, co navrací. INNER JOINEM se připravíte o možná nerelevantní, ale možná taky o relevantní hodnoty a nevyladíte ani zblo.


Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #65 kdy: 07. 10. 2019, 16:02:29 »
Tohle je ukázkový příklad antipatternu „předčasná optimalizace“. Kód má být především správný, pak přehledný, srozumitelný a udržovatelný. Což v tomto případě znamená INNER JOIN, protože u něj to každý vidí na první pohled, že jde o INNER JOIN.

To si nemyslím. Pro ladění je daleko výhodnější si vytvořit VIEW s LEFT OUTER JOINEM. Když si pak vyselektujete všechny záznamy, daleko líp si představíte, co navrací. INNER JOINEM se připravíte o možná nerelevantní, ale možná taky o relevantní hodnoty a nevyladíte ani zblo.

INNER JOIN hlavně naprosto jasně komunikuje čtenáři účel. Takže není co řešit.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #66 kdy: 07. 10. 2019, 17:05:00 »
To si nemyslím. Pro ladění je daleko výhodnější si vytvořit VIEW s LEFT OUTER JOINEM. Když si pak vyselektujete všechny záznamy, daleko líp si představíte, co navrací. INNER JOINEM se připravíte o možná nerelevantní, ale možná taky o relevantní hodnoty a nevyladíte ani zblo.
Pro ladění si používejte, co chcete. Já píšu o tom, co má být v produkčním kódu, který bude číst a udržovat i někdo jiný (nebo vy za půl roku).

e3k

  • ***
  • 217
    • Zobrazit profil
    • E-mail
Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #67 kdy: 08. 10. 2019, 20:26:37 »
nechapem ten flamewar ohladom INNER a LEFT OUTER JOIN.
proste INNER je len skupina objektov ktore su v oboch tabulkach.
zadanie bolo ze v TBL2 nie su spomenute vsetky.
pokial treba mat vo vysledku vsetky objekty tak jedine LEFT OUTER JOIN. + to pravidlo ze co v pripade ked nebolo definovane spravanie pomocou TBL2.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #68 kdy: 08. 10. 2019, 21:27:49 »
nechapem ten flamewar ohladom INNER a LEFT OUTER JOIN.

On to není úplně flamewar.
Diskuse je o tom, že jedno řešení je přesně podle požadavku.
Druhé řešení je univerzálnější pro ten konkrétní požadavek a připravené i pro další předpokladatelné situace.

Já zastávám názor, že ten, kdo projektuje dotazy, měl by myslet v širším kontextu a předcházet tak budoucím problémům.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #69 kdy: 09. 10. 2019, 10:08:21 »
nechapem ten flamewar ohladom INNER a LEFT OUTER JOIN.

On to není úplně flamewar.
Diskuse je o tom, že jedno řešení je přesně podle požadavku.
Druhé řešení je univerzálnější pro ten konkrétní požadavek a připravené i pro další předpokladatelné situace.

Já zastávám názor, že ten, kdo projektuje dotazy, měl by myslet v širším kontextu a předcházet tak budoucím problémům.

Vždyť už jsi rovnou budoucí problém napsal.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #70 kdy: 09. 10. 2019, 10:14:35 »
Vždyť už jsi rovnou budoucí problém napsal.

To je věc názoru. Zdejší diskuse ukázala, že mnoha lidem nedošlo, že neexistence záznamu v tbl2 může mít nějaký interpretovaný význam - např. pokud by se hledaly položky v tbl1 s opačným významem.

Abych to snad zakončil: já preferuji a kolegy učím, že v případě, že v druhé tabulce záznam být nemusí, mají si vytvářet dotazy outer joinem. Také doporučuju tyto základní, nebo časté operace vytknout do view a dál už pracovat výhradně nad ním. Je mnohem výhodnější, když základní strukturu programátor čte z hotového pohledu, než aby ji na každém dotazu vymýšlel znovu. Výhodnější je to i pro refaktorování, nemusí se pak revidovat spousta míst v kódu.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #71 kdy: 09. 10. 2019, 22:01:25 »
já preferuji a kolegy učím, že v případě, že v druhé tabulce záznam být nemusí, mají si vytvářet dotazy outer joinem
Když v druhé tabulce záznam být musí, bude INNER JOIN dělat to samé, co OUTER JOIN. Jinými slovy, podle vás je INNER JOIN zbytečný. Přemýšlel jste někdy o tom, proč ho autoři do jazyka SQL zařadili, a to dokonce jako výchozí?


e3k

  • ***
  • 217
    • Zobrazit profil
    • E-mail
Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #73 kdy: 11. 10. 2019, 21:22:39 »
já preferuji a kolegy učím, že v případě, že v druhé tabulce záznam být nemusí, mají si vytvářet dotazy outer joinem
Když v druhé tabulce záznam být musí, bude INNER JOIN dělat to samé, co OUTER JOIN. Jinými slovy, podle vás je INNER JOIN zbytečný. Přemýšlel jste někdy o tom, proč ho autoři do jazyka SQL zařadili, a to dokonce jako výchozí?
Filip! v prvej otazke tohoto threadu bolo spomenute ze:
1. mas tabulku 1 s ID
2. mas tabulku 2 kde su niektore ID s tabulky 1
preto LEFT JOIN... tam neni o com s inner joinom.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #74 kdy: 12. 10. 2019, 08:59:14 »
2. mas tabulku 2 kde su niektore ID s tabulky 1
preto LEFT JOIN... tam neni o com s inner joinom.

Jojo, je to tak.

To, co říká Filip, dělá spousta lidí - podmínku zaměňuje s joinovacím kritériem. Ony dost často fungují totožně, ale čitelnější (a správnější) je v joinu vyjadřovat typ spojení, a ve where vyjadřovat, co požaduji za data.

Nevím, jestli tento zlozvyk přišel s internetovými návody, nebo jestli je to třeba důsledek MySQL-školy, kde MySQL spoustu věcí neumí, nebo umí bídně, a tak programátoři hledají obezličky..