Využij akce až 30 % zdarma při nákupu e-learningu. Více informací. Zároveň je tento týden sleva až 80 % na e-learning týkající se C# .NET
Hledáme nového kolegu do redakce - 100% home office, 100% flexibilní pracovní doba. Více informací.
Avatar
Uživatel sítě :14.12.2019 21:26

Zdravím,

chci provést filtraci produktů dle atributů a jejich hodnot, které mají k sobě přiřazené.

Výpis všech dostupných filtrů (Včetně počtu produktů, které filtr zobrazí.) na základě atributů a jejich hodnot pro požadované produkty mám vyřešené, tam SQL není moc složité.

Problém nastane v případě, že si nevím rady jak zobrazit dostupné filtry včetně počtu produktů, po aplikaci nějakého filtru. Je tam problém, že atributy mají i různé skupiny a atributy ve stejné skupině se vlastně nevylučují, ale doplňují.

Díky všem za návrhy.

Zkusil jsem: Googlit a myslet.. :/

Chci docílit: Kýžené odměny.. %P

Odpovědět
14.12.2019 21:26
Chybami se člověk učí, běžte se učit jinam!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15.12.2019 18:38

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}>{na­me}</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...

 
Nahoru Odpovědět
15.12.2019 18:38
Avatar
Odpovídá na Peter Mlich
Uživatel sítě :15.12.2019 22:20

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.

Nahoru Odpovědět
15.12.2019 22:20
Chybami se člověk učí, běžte se učit jinam!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:16.12.2019 20:32

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

Editováno 16.12.2019 20:33
 
Nahoru Odpovědět
16.12.2019 20:32
Avatar
Odpovídá na Peter Mlich
Uživatel sítě :16.12.2019 21:22

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.

Nahoru Odpovědět
16.12.2019 21:22
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Uživatel sítě
Uživatel sítě :16.12.2019 21:27
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á.

Nahoru Odpovědět
16.12.2019 21:27
Chybami se člověk učí, běžte se učit jinam!
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:17.12.2019 21:09

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 ...

Editováno 17.12.2019 21:11
 
Nahoru Odpovědět
17.12.2019 21:09
Avatar
Odpovídá na Peter Mlich
Uživatel sítě :17.12.2019 22:38

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. |-)

Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět
17.12.2019 22:38
Chybami se člověk učí, běžte se učit jinam!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:18.12.2019 20:41

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 :)

 
Nahoru Odpovědět
18.12.2019 20:41
Avatar
Odpovídá na Peter Mlich
Uživatel sítě :18.12.2019 20:58

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

Editováno 18.12.2019 20:59
Nahoru Odpovědět
18.12.2019 20:58
Chybami se člověk učí, běžte se učit jinam!
Avatar
Mouser
Člen
Avatar
Odpovídá na Uživatel sítě
Mouser:19.12.2019 18:54
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ů).

Editováno 19.12.2019 18:57
 
Nahoru Odpovědět
19.12.2019 18:54
Avatar
Odpovídá na Mouser
Uživatel sítě :20.12.2019 10:56

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.

Nahoru Odpovědět
20.12.2019 10:56
Chybami se člověk učí, běžte se učit jinam!
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 12 zpráv z 12.