Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z zapytaniem - Wyciągnięcie produktów wg. atrybutów, Wyciągnięcie produktów wg. atrybutów
Gaw
post 12.09.2012, 22:06:35
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 27.11.2006

Ostrzeżenie: (0%)
-----


Witam serdecznie,

mam problem z wyciągięciem produktów wg. atrybutów.

Jeden produkt ma wiele atrybutów - chcę zrobić filtr wyszukiwania i tak np. chcę znaleść produkt, który jest w kolorze niebieskim i w rozmiarze S.

Próboję z zapytaniem:

  1. SELECT `Item`.`id`, `Item`.`quantity`, `Item`.`price`, `Item`.`minimal_price`, `Item`.`name`, `Item`.`description`, `Item`.`category_id`, `Item`.`is_active`, `Item`.`flag_id`, `Item`.`is_deleted`, `Item`.`expired`, `Item`.`created`, `Item`.`updated`, `Item`.`authake_users_id`, `Item`.`slug`, `Item`.`brand_id`, `Item`.`brand`, `Category`.`id`, `Category`.`parent_id`, `Category`.`lft`, `Category`.`rght`, `Category`.`name`, `Category`.`slug`, `Category`.`created`, `Category`.`updated`, `Category`.`is_active`, `Category`.`is_deleted`, `Category`.`sort` FROM `items` AS `Item` INNER JOIN `attributes_items` AS `AttributesItem` ON (`AttributesItem`.`item_id` = `Item`.`id`) LEFT JOIN `attributes` AS `Attribute` ON (`Attribute`.`id` = `AttributesItem`.`item_id`) LEFT JOIN `categories` AS `Category` ON (`Item`.`category_id` = `Category`.`id`) WHERE `AttributesItem`.`attribute_id` = 3 AND `AttributesItem`.`attribute_id` = 20 GROUP BY `Item`.`id` ORDER BY `Item`.`created` ASC LIMIT 25


ale nie zwraca mi w ogóle żadnego rekordu. cala sprawa rozchodzi się o:
  1. WHERE `AttributesItem`.`attribute_id` = 3 AND `AttributesItem`.`attribute_id` = 20


nie rozumiem dlaczego to nie działa. jeśli dam warunek OR to wyszuka mi produkt albo niebieski albo w rozmairze S, a ja potrzebuje produkt dokładnie spełniający te 2 kryteria.

Proszę o podpowiedź jak to zrobić.

Pozdrawiam


Go to the top of the page
+Quote Post
YaQzi
post 12.09.2012, 22:17:01
Post #2





Grupa: Zarejestrowani
Postów: 94
Pomógł: 31
Dołączył: 12.10.2008
Skąd: WAT

Ostrzeżenie: (0%)
-----


nie działa bo tutaj:

"`AttributesItem`.`attribute_id` = 3 AND `AttributesItem`.`attribute_id` = 20"
chcesz wyciągnąć rekord, dla którego attribute_id jest jednocześnie równy 3 i 20 smile.gif więc nic dziwnego, że niczego nie znajduje.


--------------------
 Wszystkie wielkości świata nie są tyle warte, co dobra przyjaźń...
Go to the top of the page
+Quote Post
vermis
post 12.09.2012, 22:29:04
Post #3





Grupa: Zarejestrowani
Postów: 279
Pomógł: 56
Dołączył: 3.06.2010
Skąd: Tarnowskie Góry

Ostrzeżenie: (0%)
-----


Tak na szybko przychodzą mi następujące rozwiązania:
- Dołącznie tabeli z atrybutami 2 razy raz dla koloru drugi raz dla rozmiaru
- możesz policzyć ile rekordów z atrybutami się dopasowało masz do wyboru 0, 1 lub 2 interesuje cię tylko 2
- możesz użyć podzapytań które sprawdzą czy istnieje wpis w tabeli z atrybutami dla koloru i osobno dla rozmiaru.

Zasadniczo struktura bazy, którą przyjąłeś jest dobra ze względu na możliwość dodawania dowolnej ilości atrybutów, ale wyszukiwanie po nich jest mało efektywne.


--------------------
Go to the top of the page
+Quote Post
alegorn
post 13.09.2012, 09:47:52
Post #4





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


dołącz tabelę atrybut dwa razy, z aliasem na kolor i rozmiar

j.
Go to the top of the page
+Quote Post
Gaw
post 13.09.2012, 18:58:06
Post #5





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 27.11.2006

Ostrzeżenie: (0%)
-----


heh, jakie to okazało się proste smile.gif

tabela z alisami smile.gif

  1. SELECT `Item`.`id`, `Item`.`quantity`, `Item`.`price`, `Item`.`minimal_price`, `Item`.`name`, `Item`.`description`, `Item`.`category_id`, `Item`.`is_active`, `Item`.`flag_id`, `Item`.`is_deleted`, `Item`.`expired`, `Item`.`created`, `Item`.`updated`, `Item`.`authake_users_id`, `Item`.`slug`, `Item`.`brand_id`, `Item`.`brand`, `Category`.`id`, `Category`.`parent_id`, `Category`.`lft`, `Category`.`rght`, `Category`.`name`, `Category`.`slug`, `Category`.`created`, `Category`.`updated`, `Category`.`is_active`, `Category`.`is_deleted`, `Category`.`sort` FROM `items` AS `Item` INNER JOIN `attributes_items` AS `Kolor` ON (`Kolor`.`item_id` = `Item`.`id`) INNER JOIN `attributes_items` AS `Rozmiar` ON (`Rozmiar`.`item_id` = `Item`.`id`) LEFT JOIN `categories` AS `Category` ON (`Item`.`category_id` = `Category`.`id`) WHERE `Kolor`.`attribute_id` = 3 AND `Rozmiar`.`attribute_id` = 20 GROUP BY `Item`.`id` ORDER BY `Item`.`created` ASC LIMIT 25


Dzięki za naprowadzenie
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.06.2025 - 13:11