У меня есть таблица:Оптимизация SQL-запроса с
+----+---------+-----------+--------------+-----------+
| id | item_id | attr_name | string_value | int_value |
+----+---------+-----------+--------------+-----------+
| 1 | 1 | 1 | prop_str_1 | NULL |
| 2 | 1 | 2 | prop_str_2 | NULL |
| 3 | 1 | 3 | NULL | 2 |
| 4 | 2 | 1 | prop_str_1 | NULL |
| 5 | 2 | 2 | prop_str_3 | NULL |
| 6 | 2 | 3 | NULL | 2 |
| 7 | 3 | 1 | prop_str_4 | NULL |
| 8 | 3 | 2 | prop_str_2 | NULL |
| 9 | 3 | 3 | NULL | 1 |
+----+---------+-----------+--------------+-----------+
И я хочу, чтобы выбрать ITEM_ID с конкретными значениями атрибутов. Но это осложняется тем фактом, что выборка должна выполняться по нескольким атрибутам. Я должен сделать это только с помощью существует:
select *
from item_attribute as attr
where (name = 1 and string_value = 'prop_str_1')
and exists
(select item_id
from item_attribute
where item_id = attr.item_id and name = 2 and string_value = 'prop_str_2')
Но число атрибутов может быть увеличена, и, следовательно, вложенные запросы с существует увеличится. Как я могу переписать этот запрос, чтобы уменьшить вложенные запросы?
UPD:
create table item_attribute(
id int not null,
item_id int not null,
attr_name int not null,
string_value varchar(50),
int_value int,
primary key (id)
);
insert into item_attribute values (1, 1, 1, 'prop_str_1', NULL);
insert into item_attribute values (2, 1, 2, 'prop_str_2', NULL);
insert into item_attribute values (3, 1, 3, NULL, 2);
insert into item_attribute values (4, 2, 1, 'prop_str_1', NULL);
insert into item_attribute values (5, 2, 2, 'prop_str_3', NULL);
insert into item_attribute values (6, 2, 3, NULL, 2);
insert into item_attribute values (7, 3, 1, 'prop_str_4', NULL);
insert into item_attribute values (8, 3, 2, 'prop_str_2', NULL);
insert into item_attribute values (9, 3, 3, NULL, 1);
Почему два запроса используют разные имена таблиц? есть 2 таблицы или один? было бы лучше добавить ожидаемый результат, чтобы мы могли лучше вас поправить. – TheProvost
@ TheProvost О, это ошибка! Это та же таблица. Я починил это. –
Запрос, который вы написали, не вернет ничего, поскольку вы выбрали два разных имени attr_name с разными значениями string_value вместо attr_name. Я думаю, вам нужно использовать attr_id для возврата некоторого результата, всегда оба условия будут терпеть неудачу, как описано в вашем запросе –