Diskuze: Filtrace produktů dle atributů
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Mas divne tabulky.
produkty
atributy
id_produkt, id_att, value (prod_att)
pocet radku (nebo php/mysql pouziva number_rows())
SELECT COUNT(id_product) FROM tab WHERE ...
A to ostatni nechapu. Seznam filtru mas v databazi.
Filtr uzivatele:
SELECT id_user, name FROM users ORDER BY name
<select>
<option value={id_user}>{name}</option>
Nebo sis to jako predstavoval zkratit na 1 select? To leda s uniony
SELECT neco as id, neco as name, 1 as typ FROM tabulka...
UNION
SELECT neco2 as id, neco2 as name, 2 as typ FROM jinatabulka...
Hmm, jak divné?
Spíže jsi hádám nepochopil logiku těch tabulek.
Samozřejmě, že obsahují ještě další sloupce (Měrná jednotka, návaznost na překlady, atd..), ale dle mého názoru nebyl důvod je zmiňovat. Opravdu jsem to zjednodušil a na logiku filtrů by to mělo stačit.
Pro jistotu přiložím obrázek myšlenky.
Také bych zmínil to, že některé atributy můžou mít typ pouze parametru a né filtru, protože dle všech parametrů definovat filtr nemá smysl. Zase by se to nemělo přehánět, proto jsem to takto zakomponoval.
Takhle, zakladem dobre polozene otazky je, aby bylo jasne, co je vstup a co ma byt vystup.
Jak jsem psal, napr filtr pro seznam uzivatelu poskladas jako
SELECT id_user, name FROM users ORDER BY name
filtr na barvu ziskas jako
SELECT id_color, name FROM colors ORDER BY color
Z tech tvych tabulek neni jasne, co mam spojit. Na druhem obrazku mas atribut
typ, takovy v tabulkach na obrazku 1 neni. jinymi slovy, mas tabulky divne.
filter (id_filter, name)
att (id_att, id_filter, name)
prod (id_product, name)
prod_att (id_product, id_att)
SELECT id_att, name FROM att WHERE id_filter=1
filter_name = barva
att_name = cervena
Dobře, moc si nerozumíme, tak jsem dám SQL, kterým získám dostupné filtry pro produkty, dle jejich id:
SELECT
attribute_value.attribute_id, attribute_value.id AS attribute_value_id, attribute_value.value, COUNT(DISTINCT product_attribute.product_id) AS total_products
FROM
product_attribute
LEFT JOIN
attribute_value ON product_attribute.attribute_value_id = attribute_value.id
LEFT JOIN
attribute ON attribute_value.attribute_id = attribute.id
WHERE
product_attribute.product_id IN (...)
GROUP BY
attribute_value_id
ORDER BY
attribute_value.attribute_id, CAST(attribute_value.value AS UNSIGNED)
Tento kód mi vrátí hodnoty s dostupným množství existujících produktů pro daný filtr. A já potřebuji vyřešit to, aby mi vracel aktuální počet produktů již s aktivními filtry pro neaktivní, klasicky jak má alza či czc a jiné eshopy.
LEFT JOIN
attribute ON attribute_value.attribute_id = attribute.id
Je pozůstatek po umazání kódu pro získání překladů pro typ atribut, zde není potřeba uvádět. Takže tato část kódu není podstatná.
Nevim, co maji na alze, ja na weby nechodim a uz vubec ne na stejne jako ty
Pokud mas tabulku
produkt_name, a, b, c
tak to resis preci grupem, ne?
SELECT COUNT(id), produkt_name, a,b,c ...
GROUP BY (a,b,c)
Zgrupuje to podle 3 atributu a spocita pocet produktu. Jenom tam musis dosadit
sloupce podle tve struktury.
Je mozne leftjoinovat i vice stejnych tabulek.
LEFT JOIN att AS a ...
LEFT JOIN att AS b ...
Ano, samozřejmě, eshop je pro tebe cizí slovo, nechápu
tu lehkou aroganci v odpovědích, ale i tak díky za snahu.
Absolutně si nepochopil moji problematiku i když jsem ji v předposledním příspěvku opravdu polopatě vysvětlil.
Snaha byla, zkusím ještě štěstí jinde.
Zde to již není tak aktivní co tomu bylo dříve.
No, problem je, ze chces ziskat sql dotazem pocet kusu pro 3 zaskrtle filtry,
nebo jiny pocet. Protoze mas tabulky spatne navrzene, tak s tim desne zapasis a
neumis dosadit asi spravna data. Pomoc je jednoducha. Prebuduj tabulky.
Asi bych dokazal ten sql dotaz sestavit, ale prijde mi to zbytecne, protoze v
okamziku, kdy budes potrebovat jeste neco dalsiho s tim delat, narazis na stejny
problem.
Jestli chces, na forum.builder.cz chodi jeden expert na sql, ktery ti to
mozna sestavi. A nebo proste musis pockat po vanocich nez se tu nekdo dalsi
objevi
Jaký by byl ideální návrh tabulky na tuhle problematiku dle tebe?
Já vlastně je využívám ještě i na výpis parametrů produktu na jeho kartě, což je logické, že to z toho bude vycházet.
Btw. díky za tip na fórko, mrknu se i tam. <3
SELECT AV.attributes_id, AV.id, AV.value, IFNULL(PX.total_products,0) AS total_products
FROM attribute_value AV
LEFT OUTER JOIN
(
SELECT PA.attribute_value_id, COUNT(DISTINCT PA.product_id) AS total_products
FROM product_attribute PA
WHERE EXISTS (SELECT 1 FROM product_attribute PAI WHERE PAI.product_id = PA.product_id AND PAI.attribute_value_id IN (6,7))
GROUP BY PA.attribute_value_id
) PX ON PX.attribute_value_id = AV.id
ORDER BY AV.attributes_id, AV.value
Místo 6,7 si dosaď idčka tvých attribute_values (tj. zaškrtlých filtrů).
Ahoj,
děkuji ti za sestavení kódu, ale bohužel to má stejný neduh jako můj kód, tedy to, že to vlastně nebere v potaz atributy ve stejné skupině (se stejným attribute_id).
Bohužel to momentálně nemám čas promyslet a vyzkoušet to zakomponovat, nejspíše se k tomu vrátím až po svátcích i tak děkuji převelice.
Zobrazeno 12 zpráv z 12.