Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

Diskusia – 9. diel - MySQL krok za krokom - Dotazy cez viacero tabuliek (JOIN)

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Kit
Tvůrce
Avatar
Kit:23.10.2012 21:50

Spojování tabulek pomocí WHERE velmi nedoporučuji, protože se tím často výrazně zvýší zátěž databázového serveru. Důsledně používejte spojování tabulek přes klauzuli ON.

Odpovedať
23.10.2012 21:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Kit
David Hartinger:24.10.2012 13:35

Díky za komentář, můžeš upřesnit, co zátěž způsobuje? Je to převod dotazu na JOINy nebo že se to převede špatně?

Odpovedať
24.10.2012 13:35
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovedá na David Hartinger
Kit:24.10.2012 13:58

Tu zátěž způsobují horší možnosti optimalizace dotazu. Může se stát, že optimalizátor zvolí méně vhodnou strategii. V nejhorším případě dokonce vytvoří kartézský součin obou tabulek a z nich teprve vybírá.

Rozdělení selekce do sekcí ON a WHERE také napomáhá čitelnosti dotazu. Je na první pohled vidět, co souvisí se spojením tabulek a co je vyhledávací dotaz.

Často je vhodnější JOIN nahradit operátorem IN, který je téměř vždy rychlejší, ale vždy se použít nedá.

Odpovedať
24.10.2012 13:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Kit
David Hartinger:24.10.2012 14:07

A to IN se nahrazuje pomocí poddotazu, že? K nim se také brzy dostanu.

Odpovedať
24.10.2012 14:07
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovedá na David Hartinger
Kit:24.10.2012 14:28

Přesně tak. Mnoho vývojářů se poddotazů bojí, protože si myslí, že by to mohlo snížit výkon aplikace. Opak je pravdou, poddotazy bývají velmi efektivní. Jen je nutné si uvědomit, že se výsledky zpravidla neindexují, ale při správném použití to nevadí.

Chtěl jsem uvést příklad, ale nejprve si počkám na další díl seriálu. Třeba ho tam uvedeš v té podobě, kterou mám na mysli.

Odpovedať
24.10.2012 14:28
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Kit
David Hartinger:24.10.2012 14:46

Na MySQL jsem slyšel v souvislosti s poddotazy hodně kritiky.

Příště bude dotaz přes 3 tabulky a vazba M:N. Uvidím, co se mi tam ještě vejde, mám asi 3/4 hotové. Další díly bych rád věnoval pouze procvičování dotazů, tam od tebe očekávám kritiku :) Ještě nevím, jak to sestavím, vždycky se to vyvrbí až na konci.

Editované 24.10.2012 14:47
Odpovedať
24.10.2012 14:46
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovedá na David Hartinger
Kit:24.10.2012 14:56

To není chybou MySQL, ale chybou nepochopení funkce poddotazů. I když jejich implementace v MySQL je občas trochu podivná. V každém případě je to přes poddotazy výrazně rychlejší, než to řešit v aplikaci. Pokud to u nějakého dotazu neplatí, byl chybně napsán. Může to být zaviněno i chybnou strukturou databáze nebo nevhodnými indexy.

Odpovedať
24.10.2012 14:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
kamil.kotek
Člen
Avatar
kamil.kotek:17.3.2013 21:22

Chci se zeptat,jak udělat abych spojil více tabulek a více sloupcu?
myslím tím,že mám 2 tabulky
jednu která je seznam předmětu (id,image,name)
a spojování
(id,id_user,id_pred­metu,id_zaco)
kde id je id řádku,id_user id uživatele,id_pred­metu je id toho předmětu co nabízím,a id_zaco je id co za ten předmět chci(to je také v tom seznam předmětu,id_před­mětu a id_zaco jsou ve stejné tabulce(v tom seznamu)
a ted potřebuju udělat tohle,
někdo podá že chce prodat nějakou věc,a chce jí prodat za jinou věc(jedná se o takovou hru..nebo spíše manažer jiné hry(takové ulehčení té hry pro cech))
takže,podá předmět,třeba zlato,a chce ho prodat za dřevo.
takže se ve spojení udělá novej řádek
id-1,id_user-1,id_predmetu-41(např),id_zaco-23
a ted v php potřebuju udělat nějak to spojení aby to na sebe nenavazovalo.­.jelikož mám jako cyklovač foreach..
ted jak to mám,tak to označuje jako jedno a to samé,tak že dám echo name
a zobrazí se mě name stejné jak u id_predmetu tak i id_zaco
pořád přemešlím jak to napravit..ale nějak mě to nejde..můžete mě něco navrhnout? doufám že jste tenhle problém nějak pochopily..
díky :)

 
Odpovedať
17.3.2013 21:22
Avatar
tvojotecko
Nevyplnené
Avatar
tvojotecko:9.7.2013 2:14

Nepochopili synu.

 
Odpovedať
9.7.2013 2:14
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovedá na kamil.kotek
Honza Bittner:9.7.2013 8:43

Přečti si znova tutoriál, každý kdo ho musí pochopit. Je to tam dobře vysvětlené.

Odpovedať
9.7.2013 8:43
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!