Получить несколько записей на основе нескольких условий И ГДЕ

0

В настоящее время я борюсь с запросом, который должен извлекать несколько записей из моей таблицы на основе нескольких предложений 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.

Любая помощь будет оценена.

Теги:
database

3 ответа

2
Лучший ответ

Это звучит как UNION различных запросов.

SELECT ... WHERE ...
UNION
SELECT ... WHERE ...
UNION
SELECT ... WHERE ...
3

Если вы используете 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
  • 0
    К сожалению, мне нужно ВСЕ, где условия, чтобы быть правдой, так что это не будет работать.
  • 0
    @Aron Rotteveel: Так что, просто используйте AND вместо OR . Или я что-то упустил?
Показать ещё 2 комментария
1

будет ли это работать?:

SELECT `client_entity_int`. * 
FROM `client_entity_int` 
WHERE (attribute_id=1 AND value=0) OR (attribute_id=3 AND value=3)
...
  • 0
    К сожалению, мне нужно ВСЕ, где условия, чтобы быть правдой, так что это не будет работать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню