Forum » Programiranje » Pomoč pri izdelavi MySQL poizvedbe...
Pomoč pri izdelavi MySQL poizvedbe...
no comment ::
Ne, ne, vse je cool, no comment...
OP pri tvoji oz. leeonovi rešitvi najverjetneje ne bi opazil nobenega problema.
Najboljša rešitev je itak bemfova, kjer mora OP zaradi banalnega problema začeti kar znova postavljati model. Naučil se bo kako uporabljat json ali xml, ki sta na silo privijačena na SQL, čez nekaj časa si bo natreniral možgane, da bo celo znal narediti ustrezni select. Le-ta bo par magnitud počasnejši kot najbolj kmečka rešitev, ki je predstavljena tu. Success!
Ahim ::
no comment je izjavil:
Treba je transponirat. Poglej si kako se to naredi v MySQL. Za T-SQL sem dal že jaz primer. Če ti ne prihajajo vsako sekundo novi artikli v bazo, pač materializiraš takšen transponiran pogled iz katerega je potem select bliskovit. Sicer pa uporabiš varianto, ki sem jo tudi že napisal (leeon-ova je na isto vižo).
Najblizje temu v MySQL je to, kar sem predlagal zgoraj in iskanje z uporabo FULLTEXT indeksa (IN BINARY MODE).
Se vedno ne vemo kaksna je dejanska kolicina podatkov, s katero se ukvarja OP (koliko produktov, koliko razlicnih parov ime_atributa + vrednost_atributa) ... od teh dveh podatkov bo odvisen performance.
kuall ::
zakaj vsi pišete queryje z 10 joini in posledično 10x delate query na eno in isto tabelo? a ni tu nobenega DBA-jevca, ki bi povedal, kako slabo je to iz performančnega vidika?
bistvo baz so indexi in tree search oziroma index seek.
če hočeš najti 10 različnih atributov v isti tabeli boš moral pognat 10 različnih tree searchov, ne moreš vseh najti v enem koraku. če pa govorimo o index seek, torej skeniranju cele tabele, pa greš lahko samo 1x čez ja, ampak je brezveze.
urli ::
select Ime_izdelka
from ime_tabele
group by Ime_izdelka
having sum(case when Ime_atributa = 'velikost' and Vrednost_atributa = 'L' then 1
when Ime_atributa = 'barva' and Vrednost_atributa = 'modra' then 1
else 0 end) = 2
Ni hitro se mi je zdela ta rešitev čudovita ampak ne bo ok. Med sklopi atributov mora biti "AND" ampak med samimi vrednostmi atributov sklopa je pa "OR". Torej npr. tole bo vračalo različne sume... če je izdelek1 modre barve na zalogi v L, XL, M bo sum 4, izdelek2 modre barve pa le v L bo sum 2 in slednji bo "odletel" iz rezultatov zadetkov, čeprav bi moral biti.
...having sum(case when Ime_atributa = 'velikost' and ( Vrednost_atributa = 'L' OR Vrednost_atributa = 'XL' OR Vrednost_atributa = 'M') then 1 when Ime_atributa = 'barva' and Vrednost_atributa = 'modra' then 1 else 0 end) = 4
Ostalo preverim kasneje, zdajle ne utegnem, ste mi dal kup idej, tako da hvala za predloge. Se mi pa najbolj logično zdi kak pivot.
* Ahim - ne gre se za live shop, seveda je pa zaželeno, da je performance soliden (v mejah, zaenkrat, "neeksotike" - mi je jasno, da če imaš na milijone izdelkov in atributov, da je potrebno stvari tudi nekako "keširati" in ne vem kaj še čarati, da zadeva hitro deluje - ampak slednje me recimo da zaenkrat ne zanima) - zaenkrat recimo, da se osredotočam na neke manjše (?) zadeve par 100 izdelkov, mogoče par 1000.
Zgodovina sprememb…
- spremenil: urli ()
leeon ::
select Ime_izdelka
from ime_tabele
group by Ime_izdelka
having sum(case when Ime_atributa = 'velikost' and Vrednost_atributa = 'L' then 1
when Ime_atributa = 'barva' and Vrednost_atributa = 'modra' then 1
else 0 end) = 2
Ni hitro se mi je zdela ta rešitev čudovita ampak ne bo ok. Med sklopi atributov mora biti "AND" ampak med samimi vrednostmi atributov sklopa je pa "OR". Torej npr. tole bo vračalo različne sume... če je izdelek1 modre barve na zalogi v L, XL, M bo sum 4, izdelek2 modre barve pa le v L bo sum 2 in slednji bo "odletel" iz rezultatov zadetkov, čeprav bi moral biti.
...having sum(case when Ime_atributa = 'velikost' and ( Vrednost_atributa = 'L' OR Vrednost_atributa = 'XL' OR Vrednost_atributa = 'M') then 1
when Ime_atributa = 'barva' and Vrednost_atributa = 'modra' then 1
else 0 end) = 4
Ostalo preverim kasneje, zdajle ne utegnem, ste mi dal kup idej, tako da hvala za predloge. Se mi pa najbolj logično zdi kak pivot.
* Ahim - ne gre se za live shop, seveda je pa zaželeno, da je performance soliden (v mejah, zaenkrat, "neeksotike" - mi je jasno, da če imaš na milijone izdelkov in atributov, da je potrebno stvari tudi nekako "keširati" in ne vem kaj še čarati, da zadeva hitro deluje - ampak slednje me recimo da zaenkrat ne zanima) - zaenkrat recimo, da se osredotočam na neke manjše (?) zadeve par 100 izdelkov, mogoče par 1000.
jaz sem napisal query glede na to, kar si do takrat povedal. nisi nič omenil and/or pogojev..
no comment ::
Torej npr. tole bo vračalo različne sume... če je izdelek1 modre barve na zalogi v L, XL, M bo sum 4, izdelek2 modre barve pa le v L bo sum 2 in slednji bo "odletel" iz rezultatov zadetkov, čeprav bi moral biti.
Se mi zdi, da ne razumeš najbolje kako stvar deluje.
sqlfiddle...
Zgodovina sprememb…
- spremenilo: no comment ()
urli ::
no comment je izjavil:
Torej npr. tole bo vračalo različne sume... če je izdelek1 modre barve na zalogi v L, XL, M bo sum 4, izdelek2 modre barve pa le v L bo sum 2 in slednji bo "odletel" iz rezultatov zadetkov, čeprav bi moral biti.
Se mi zdi, da ne razumeš najbolje kako stvar deluje.
sqlfiddle...
Mislim, da ti ne razumeš, kaj sem napisal?
sqlfiddle 1
sqlfiddle 1
Zgodovina sprememb…
- spremenil: urli ()
no comment ::
Ja, verjetno res ne znaš dovolj jasno specificirat zahtev. Če sem prav razbral iz SQLa (ki ga očitno pišeš narobe) hočeš to:
SQL
?
edit: ampak to je quick & dirty (pravilno bo delalo samo, če so preseki naborov vrednosti za različne atribute prazni, npr. nimaš atributov barve čevljev in barve vezalk, ki imajo lahko enake vrednosti)
SQL
?
edit: ampak to je quick & dirty (pravilno bo delalo samo, če so preseki naborov vrednosti za različne atribute prazni, npr. nimaš atributov barve čevljev in barve vezalk, ki imajo lahko enake vrednosti)
Zgodovina sprememb…
- spremenilo: no comment ()
urli ::
no comment je izjavil:
Ja, verjetno res ne znaš dovolj jasno specificirat zahtev. Če sem prav razbral iz SQLa (ki ga očitno pišeš narobe) hočeš to:
SQL
?
edit: ampak to je quick & dirty (pravilno bo delalo samo, če so preseki naborov vrednosti za različne atribute prazni, npr. nimaš atributov barve čevljev in barve vezalk, ki imajo lahko enake vrednosti)
Komaj zdajle sem na hitro uspel preveriti zgornje in bi rekel, da lepo deluje. Vrednosti atributov imam tako unique (slug). Dobro si tole sestavil. Moram še podrobno preveriti, če bo ok za to kar potrebujem, urediti "finese" ampak mislim, da bom uporabil kar tvojo rešitev, tako da hvala
Zgodovina sprememb…
- spremenil: urli ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Neveljaven mysql stavek - napaka #1054 - Unknown column 'PRODUCTS.TAXCAT' in 'on clauOddelek: Programiranje | 2170 (2044) | MrStein |
» | podatkovne baze pomočOddelek: Programiranje | 3051 (2604) | kr?en |
» | Baza & c#Oddelek: Programiranje | 4156 (3214) | xardas |
» | podatkovna bazaOddelek: Programiranje | 2040 (1861) | scarymovie |
» | baze podatkovOddelek: Programiranje | 1564 (1483) | urkrajnc |