Как правильно составить запрос на извлечение данных?

Рейтинг: 1Ответов: 1Опубликовано: 03.09.2014

Есть две таблицы: Good(name, id) и GoodHasAttribute(good_id, attribute_id, value). В таблице GoodHasAttribute хранятся значения атрибутов для каждого товара. Мне нужно извлечь товары с указанными свойствами. В настоящий момент есть следующий запрос:

SELECT *
FROM Good t
JOIN GoodHasAttribute goodAttributes ON   
(`goodAttributes`.`good_id`=`t`.`id`) and 
(
((goodAttributes.attribute_id=1) AND (goodAttributes.value LIKE '%белый%')) or
((goodAttributes.attribute_id=3) AND (goodAttributes.value LIKE '%красный%'))
)

Он возвращает мне только те товары, в которых есть хотя бы один атрибут, но мне нужно с обеими.

Пока что придумал убрать группировку условий и or заменить на and, но в таком случае я также получу товары с атрибутами "attribute_id=1, value=красный" и "attribute_id=3, value=белый".

Какой запрос извлечет нужные мне данные?

Ответы

▲ 1

надо использовать два join-а. примерно так:

SQL Fiddle

MySQL 5.6 Schema Setup:

create table g (id int, n text);
insert into g values
   (1, "товар1")
  ,(2, "товар2")
;

create table a (id int, g int, v text);
insert into a values
   (1, 1, "белый")
  ,(3, 1, "красный")
  ,(1, 2, "серый")
  ,(3, 2, "зелёный")
;

Query 1:

select *
 from g
join a a1
 on a1.g = g.id and a1.id = 1 and a1.v like "%белый%"
join a a2
 on a2.g = g.id and a2.id = 3 and a2.v like "%красный%"

Results:

| id |      n | id | g |     v | id | g |       v |
|----|--------|----|---|-------|----|---|---------|
|  1 | товар1 |  1 | 1 | белый |  3 | 1 | красный |