Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z zapytaniem - Wyciągnięcie produktów wg. atrybutów
Forum PHP.pl > Forum > Bazy danych > MySQL
Gaw
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


YaQzi
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.
vermis
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.
alegorn
dołącz tabelę atrybut dwa razy, z aliasem na kolor i rozmiar

j.
Gaw
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.