Diskuze: dotazy ma mysql db

PHP PHP dotazy ma mysql db American English version English version

Avatar
ojam
Člen
Avatar
ojam:

Ahoj, mam otazku ohladne spracovania viacerych dotazov na MySql databazu. Mam web stranku na ktorej mam foto galeriu.

Struktura databazy je:

  • tabulka Kategorie(id,...)
  • tabulka Obrazky(id_Ka­tegoria...ratin­g,click)
  • tabulka Obrazky_komen­tare(id_Obraz­ky...)

V skripte najskor ziskam z (tabulky Kategorie) stromovu strukturu Menu, to je prvy dotaz na db. Inspiraciu na stromovu strukturu som nasiel na jednej zahranicnej stranke.
V dalsej casti skriptu riesim situaciu kde
zistujem ID Kategorie, a ak nejake ID bolo zaregistrovane, tak nasledne posielam dalsi dotaz na db (tabulka Kategorie) ktorym ziskam sub-kategorie ktore sa budu zobrazovat samostatne v navigacnom panely. Takze od zvoleneho ID Kategorie sa vyberie vsetko smerom dole az na najnizsiu uroven.
Treti dotaz je opet dotaz na db (tabulka Kategorie), kde ale naopak v inom panely, povedzme informacnom ziskavam stromovu cestu od zvolenej ID Kategorie smerom hore, takze vidim kde som momentalne zanoreny.

Stvrty dotaz na db je uz len vyselektovanie obrazkov podla ID Kategorie z (tabulky Obrazky), ktory by sa teda mohol zlozit aj s (tabulkou Obrazky_komentare) aby som dostal aj prislusne komentare k obrazkom.

Dalsim piatym dotazom by mohlo byt povedzme zistenie poctu obrazkov pre kazdu Kategoriu.
Proste by ma zaujimalo ako sa taketo dotazy riesia pri vacsich projektoch (e-shopoch a podobne), pripadne ci su nejake obmedzenia kedy uz poced dotazov je potrebne zvazit. Diky za reakcie.

 
Odpovědět 21.1.2014 15:11
Avatar
Odpovídá na ojam
Michal Žůrek (misaz):

mě vždycky stačili vnořené dotazy, nikdy jsem rpo jednu věc nepoužil víc jak jeden dotaz.

Nahoru Odpovědět  +1 21.1.2014 15:14
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na ojam
Kit:

zistujem ID Kategorie, a ak nejake ID bolo zaregistrovane, tak nasledne posielam dalsi dotaz na db (tabulka Kategorie) ktorym ziskam sub-kategorie ktore sa budu zobrazovat samostatne v navigacnom panely.

Zrovna tohle je dobré sdružit do jednoho dotazu.

SELECT s.nazev FROM sub_kategorie AS s JOIN kategorie AS k
    ON s.kategorie_id = k.id
    WHERE k.nazev = 'nazev kategorie'

Podobně se dají navázat i subsubkategorie.

Stromová data se z databáze sice tahají divně, ale jde to. Nezkoumal jsem vše, co jsi napsal, ale možná by se to dalo všechno zvládnout jedním vrzem.

Spousta vývojářů však napíše 5 SQL dotazů a neřeší to.

Nahoru Odpovědět 21.1.2014 15:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
ojam
Člen
Avatar
ojam:

len doplnim ze tabulka Kategorie obsahuje aj vsetky sub-kategorie. Prave takuto stromovu strukturu som nasiel na jednej stranke, takze na sub-kategorie nie je ziadna dalsia tabulka, je to proste v jednej.

 
Nahoru Odpovědět 21.1.2014 15:43
Avatar
mkub
Redaktor
Avatar
Odpovídá na ojam
mkub:

narychlo som si to precital, ale zbytocne pouzivas vela hednoduchych qyeries, co takto pospajat ich do jedneho a riesit to pomocou neho? ako na to, najdes v tutorialoch a v komentaroch pod nimi

ked pouzivas viacnasobne query a v PHP to spojis do vysledku, tak neunormne klesa vykonnost kodu a casto sa stane, ze aj neoptimalizovane query je ovela vykonnejsie ako viacero mensich

 
Nahoru Odpovědět 21.1.2014 15:51
Avatar
Kit
Redaktor
Avatar
Odpovídá na ojam
Kit:

V tom případě se dá použít tohle:
http://www.itnetwork.cz/…y-z-databaze

Zjednodušeně řešeno: Stáhneš si celou tabulku a v paměti z ní teprve uděláš strom. V relační databázi se tohle bez přídavných sloupců efektivně řešit nedá.

Nahoru Odpovědět 21.1.2014 16:27
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
ojam
Člen
Avatar
ojam:

Neviem ci som to spravne pochopil, takze z mysql db si len vytiahnem celu tabulku Kategorii ktoru by som mal natiahnut do sqlite tabulky v pamati a tam prevediem vysledny select na ziskanie stromu?
Nejako mi neni jasne to naplnenie tabulky v pamati, mozes uviest nejaky priklad?

$mem_db = new PDO('sqlite::me­mory:')
$mem_db->exec("CREATE TABLE Kategoria...)
$update = "UPDATE Kategoria...")
$mem_db->exec($update)

 
Nahoru Odpovědět 22.1.2014 14:40
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.