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.
Zobrazeno 12 zpráv z 12.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.