В настоящее время я борюсь с запросом, который должен извлекать несколько записей из моей таблицы на основе нескольких предложений WHERE. Каждое предложение WHERE содержит два условия.
Таблица:
+--------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| entity_id | int(11) | YES | MUL | NULL | |
| attribute_id | int(11) | YES | | NULL | |
| value | int(11) | YES | | NULL | |
+--------------+---------+------+-----+---------+----------------+
Что мне нужно получить:
Одна или несколько записей, соответствующих массиву attribute_id с соответствующими значениями. В этом случае у меня есть массив со следующей структурой:
array(
attribute => value,
attribute => value,
attribute => value
)
Проблема:
Я не могу циклически перемещаться по массиву и создавать предложения WHERE для этого запроса, так как каждое условие WHERE автоматически отрицает другое. Все пары атрибут/значение должны быть сопоставлены.
Я почти думал, что у меня есть решение с этим запросом:
SELECT `client_entity_int`. *
FROM `client_entity_int`
WHERE (attribute_id IN (1, 3))
HAVING (value IN ('0', '3'))
... но, очевидно, это будет извлекать оба значения для обоих атрибутов, где мне нужен только атрибут 1, а атрибут 3 - 3.
Любая помощь будет оценена.
Это звучит как UNION различных запросов.
SELECT ... WHERE ...
UNION
SELECT ... WHERE ...
UNION
SELECT ... WHERE ...
Если вы используете OR, не каждое предложение WHERE будет отрицать другое:)
Например:
WHERE (attribute_id = 1 and value = '0')
OR (attribute_id = 3 and value = '3')
Чтобы утверждать, что все условия совпадают, посчитайте совпадения:
WHERE (attribute_id = 1 and value = '0')
OR (attribute_id = 3 and value = '3')
GROUP BY entity_id
HAVING COUNT(*) = 2
будет ли это работать?:
SELECT `client_entity_int`. *
FROM `client_entity_int`
WHERE (attribute_id=1 AND value=0) OR (attribute_id=3 AND value=3)
...
AND
вместоOR
. Или я что-то упустил?