Autor Zpráva
Jcas
Profil *
Zakládám tento dotaz, protože to nemůžu pochopit (where, left join, group_concat), tak bych rád poprosil, kdyby jste to tu jasně a pořádně vysvětlili. Celkem dost se to tu řeší, tak ať je v tom už jasno.

Tabulka - zvíře
id - druh - dělá
1. - pes - kouše
2. - kočka - mňouká

Tabulka - jmeno_zv
id - jméno - druh
1. - Alan - pes
2. - Ster - kočka
3. - Bety - pes
4. - Dan - myš

A nyní mi jde o to, jaký dotaz kdy použít, protože máme více způsobů, jak tyto dvě tabulky zpracovat. a jak to vlastně funguje.

Příklad1. Vezmu tabulku jmeno_zv a přiřadím k tomu "dělá"
1. - Alan - pes - kouše
2. - Ster - kočka - mňouká
3. - Bety - pes - kouše
4. - Dan - myš - 0 (nic-zde není co přiřadit)
Příkaz projede všechna jména na základě sloupce druh ji přidá, co dělají
Zde jsou dvě varianty a to že se 4. řádek zpracuje i s hodnotou null a nebo se nezpracuje vůbec

Přklad2. Ale co kdybych chtěl obrácené zpracování a výsledek na dva řádky (viz. první tabulka)
1. - pes - kouše - Alan
2. - kočka - mňouká - Ster

a protože už žádné další řádky v tabulce nemáme, tak to skončí. Opakuji, nemůžu pochopit, jak to funguje. Jak co funguje.
Příkaz vezme první řádek tabulky a hledá, až najde ve druhé tabulce odpovídající údaj a potom přejde na další řádek v první tabulce, najde odpovídající údaj a tím skončí. Dál nepokračuje, protože v první tabulce máme jen dva řádky

Příklad3. Další možné zpracování
1. - pes - Alan - kouše
2. - pes - Bety - kouše

Přiklad4. Menší rozdíl oproti prvnímu.
V prvním přikl. stavím dotaz od druhé tab. k první, protože druhá tabulka má víc řádků.
Tedy: Vem první řádek tabulky a přiřaď k tomu, co zvíře děla.
Ovšem nyní chci dotaz postavit jinak.
Vem první řádek tabulky zvíře a přiřaď k tomu všechna jména.

1. - pes - kouše - Alan
2. - pes - kouše - Bety
3. - kočka - mnouká - Ster
4. Další zvíře nemáme

Doufám, že jste z těch příkladů pochopili, o co mi jde a co nemůžu pochopit.
Jakým způsobem(při jednotlivých příkazech) se zpracovávají data z více tabulek
(Chtěl jsem napsat ukázky kodu, co si myslím, ale nechcu sem psát chybné kody)
Michal Benda
Profil
Hned první co je potřeba si uvědomit - ty tabulky jsou špatně navrženy - resp. tabulka jmeno_zv by neměla mít sloupec druh, ale místo toho sloupec zvire_id - to je prostě jednak zvyk a druhak se s tím lépe pracuje.

Jinak moc nechápu na co se ptáš - z těch 4 příkladů má smysl snad jenom ten první a ten by vypadal takto:

SELECT `zvire`.*, `jmeno_zv`.* FROM `jmeno_zv` LEFT JOIN `zvire` ON `jmeno_zv`.`zvire_id` = `zvire`.`id`;


Ten poslední řádek se tímto způsobem také zpracuje, ale s hodnotou null - nezpracoval by se při použití INNER JOIN.
Doporučuji si nastudovat tzv. kardinalitu vztahů - na základě toho se pak slučují tabulky tak aby to odpovídalo návrhu.
Jcas
Profil *
Bezva. Tak to máme rozdíl mezi LEFT JOIN a INNER JOIN.
Přikl.3. Toho bych asi dosáhnul naprosto stejně, kdybych za tvůj příklad dosadil ještě
AND WHERE 'jmeno_zv'.'zvire_id' = 'pes'

schválně to nemám v code - nechcu zde ukazovat špatné kody

A jaký by byl rodíl, při použití:
SELECT `zvire`.*, `jmeno_zv`.* FROM `jmeno_zv`, `zvire` WHERE `jmeno_zv`.`zvire_id` = `zvire`.`id`;


Přikl.2 tabulka má pouze dva řádky, takže výsledek bude pouze na dva řádky a pouze k tomu přiřaď (jako příkl.) nějaké jméno. (to je asi nesmysl, to nikdy nikdo nebude chtít)

Příkl.4 by se řešil jak (ten mě konkrétně zajíma)
Michal Benda
Profil
Jcas:
A jaký by byl rodíl, při použití:
1
SELECT `zvire`.*, `jmeno_zv`.* FROM `jmeno_zv`, `zvire` WHERE `jmeno_zv`.`zvire_id` = `zvire`.`id`;
Pokud se nemýlím, tak by to vrátilo tzv. kartézský součin.

Příklad číslo 2:
SELECT `zvire`.*, `jmeno_zv`.* FROM `jmeno_zv`RIGHT JOIN `zvire` ON `jmeno_zv`.`zvire_id` = `zvire`.`id`;

Příkladu číslo 4 nerozumím a jinak následnující citace je špatná:

V prvním přikl. stavím dotaz od druhé tab. k první, protože druhá tabulka má víc řádků.
Stavíš dotaz od tabulky jmeno_zv ne proto že má více řádků ale proto že obsahuje cizí klíč na tabulku zvire
Jcas
Profil *
Stavíš dotaz od tabulky jmeno_zv ne proto že má více řádků ale proto že obsahuje cizí klíč na tabulku zvire - Nerozumím (tohle možná bude hlavní kámen urazu). Proč neobsahuje první tabuka klíč pro druhou.
Alan kouše protože je pes, nebo protože je Alan pes, tak kouše.

A to bude asi i problém přikl.4. A navíc mě právě napadlo, že příkl.4 je problém setřídění.
Vypíšu všechny psi chovatele1, potom všechny kočky chovatele1, potom všechny psi chovatele2 atd.
Michal Benda
Profil
Jcas:
Alan kouše protože je pes, nebo protože je Alan pes, tak kouše.
Měl by sis také projít normy pro návrh databáze. Obě dvě věty se dají poskládat pomocí stejného slučování. Není tudíž potřeba užití jiného sql dotazu.

Proč neobsahuje první tabuka klíč pro druhou.
Všichni psi koušou, ale ne všichni psi se jmenují Alan - proto cizí klíč obsahuje druhá tabulka - znovu připomínám - nutnost znalosti kardinality vztahů.

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