Autor Zpráva
Clint
Profil
Zdarec,
mám tabulku, která ukládá rozšířené vlastnosti produktů, jako je barva, velikost, výroba apod. Tyto hodnoty co jsem napsal jsou jako příklad, mohou se objevit i jiné, jako je např. skladem, popis2 a takto bych mohl pokračovat donekonečna. Jednoduše řečeno nikdy dopředu nebudu vědět, jaké sloupce tabulka bude mít, protože se jedná o dynamickou tabulku a každý eshop, požaduje jiné vlastnosti pro produkt.

Potřebuji vytáhnout všechny sloupce mimo těch 3, který jsou pevně daný, viz př.:
pevně dané sloupce
id
product_id
deleted

a tady jsou dynamické sloupce
exp_color
exp_size .... atd.

pokud použiji SELECT * FROM - tak dostanu všechny sloupce, jenže já potřebuji pouze exp_color, exp_size, ....
Kajman
Profil
Proč ty vlastnosti ukládáte do sloupců a neukládáte je do další tabulky do více řádků? Tam to pak jde jednoduše.

Můžete si sice udělat např. view s chtěnými sloupci, nebo se jedním dotazem mrknout na všechny sloupečky dané tabulky a sestavit si podle dat potřebný druhý dotaz, ale volil bych předělání tabulek - to přinese i možnost mít v eshopu různorodé zboží s různorodými parametry bez zbytečných komplikací.
Clint
Profil
Kajman:
protože co sloupec to vlastnost co řádek to data o produktu
maks
Profil
Clint:
předělej tabulky tak, jak radí Kajman.

tzn. nějak takhle:
vlastnosti: id vlastnosti | název vlastnosti (příklad: 3, 'barva')
vlastnosti_produktu: id | id_produktu | id_vlastnosti | hodnota vlastnosti (příklad: 1, 4, 3, 'modrá'
Clint
Profil
maks:
no rád bych abych nemusel když chci zjistit nějaký data o produktu, joinovat 3 a více tabulek, ale ten příklad stojí na zamyšlení, jde o to, že mám nějakou strukturu db se kterou nemůžu moc hýbat, protože je na to napojeno více věcí

mám totiž základní tabulku - kde jsou základní věci o produktu a pak roz.tab - kde jsou věci které požaduje klient. Je třeba si uvědomit, že některé eshopy mají 25000 produktů a víc, musíme taky brát ohled na dobu vykonávání scriptů
maks
Profil
Clint:
abych nemusel když chci zjistit nějaký data o produktu, joinovat 3 a více tabulek
je to správná cesta.

jde o to, že mám nějakou strukturu db se kterou nemůžu moc hýbat, protože je na to napojeno více věcí
... aneb klasické: něco dělám jinak, než se má, jsem líný, tak to zkusím svést na to, že nemohu.

Dělej, jak myslíš. Dostal jsi návod, jak pracovat se svým současným řešením, dostal jsi také návod, jak to udělat celé sice jinak, ale lépe. Vyber si, co chceš, ty se o to budeš do budoucna starat.

Zpravidla nutnost měnit za běhu aplikace tabulky bývá způsobena špatným návrhem databáze.
Clint
Profil
maks:
je to správná cesta
osobně si myslím, že abych zjistil jestli je produkt červený nebo bílý - je špatná cesta, používat LEFT JOIN přes 4 tabulky, když to jde přes dvě. Musí se taky myslet, aby dotaz byl jednoduchý s minimálním rizikem chybovosti - což u 4 LEFT JOINu je větší než u jednoho ....

... aneb klasické: něco dělám jinak, než se má, jsem líný, tak to zkusím svést na to, že nemohu.
promiň, ale jedná se o novou funkcionalitu a na té dosavadní funguje x webu, tam nemůžu ohrozit funkčnost webu - že si změním strukturu db - tím pádem nepojede backend a zároveň frontend - bavíme se o tom, že něco je nějak udělaný a nemůžu to předělat jinak, to můžu sednout a do konce roku předělávat weby.

Nakonec jsem si pomohl úplně jinak.

Ještě maličkost tabulka která udává vlastnosti, tam je - je potřeba si ale uvědomit, že vlastnosti můžou být libovolné a vlastnosti může nabývat například, produkty, katalog, soubory, články, rubriky apod... takže nelze udělat něco co bude pro produkty, ale něco co mohou využívat všechny jmenované.


maks:
Možná že jsem položil otázku blbě na začátku, tak jinak: jak vytáhnout pomocí dotazu SELECT určité sloupce, aniž bych je musel vypisovat za SELECT.

Není něco jako SELECT * (tady budou nějaký příkaz který bude ignorovat vypsané sloupce)
Tori
Profil
Clint:
Je třeba si uvědomit, že některé eshopy mají 25000 produktů a víc
... ale jen výjimečně potřebujete pracovat naráz se všemi 25k, ne? U většiny běžných činností v eshopu AFAIK pracujete se stránkovaným zjednodušeným výpisem produktů (teda s cca 30 produkty naráz) anebo s jedním produktem se všemi podrobnostmi. Ergo pokud za této situace je zásadní rozdíl v trvání SQL dotazu u 20 a u 20000 produktů, tak je to chybou nedostatečné optimalizace dotazu, chybného používání indexů apod.
Clint
Profil
Tori:
Jde o to, že si bohužel nemůžu dovolit změnit databázovou strukturu - ne že jsem lenivý, ale protože, změna db, znamená změna scriptů v backendu a na frontendu a já jsem časově limitovaný. O nějakých změnách se dá uvažovat v nějaké nové verzi.
peta
Profil
"data o produktu, joinovat 3 a více tabulek"
"je špatná cesta, používat LEFT JOIN přes 4 tabulky"
Ono je tak slozite pridat LEFT JOIN do 20 sql dotazu? Pokud je mas rozumne napsane, tak otazka asi 30 min.

"jenže já potřebuji pouze exp_color, exp_size,"
Ono by se dalo jit pres strukturu tabulky (pokud mas prava ziskavat strukturu), ze si vytahnes ze struktury vsechny column_name, ktere nejsou v array a zkombinujes to pak s ti dalsim dotazem.

Google znas (sql select all without column)? Hodnej strejda.
http://stackoverflow.com/questions/729197/sql-exclude-a-column-using-select-except-columna-from-tablea
http://dba.stackexchange.com/questions/1957/sql-select-all-columns-except-some
http://www.sqlservercentral.com/Forums/Topic667861-338-1.aspx
Clint
Profil
peta:
díky za linky to jsem zrovna hledal

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: