Задать вопрос

Таблица связей. Выбор значений object_id, option_id которых равны одновременно нескольким значениям

Есть таблица связей:

CREATE TABLE `object_option` (
`object_id` int(11) NOT NULL,
`option_id` int(11) NOT NULL
PRIMARY KEY (`object_id`,`option_id`)
)

Нужно выбрать из таблицы такие object_id, option_id которых равны одновременно нескольким значениям.

Пример:
object_id option_id
1 1
1 2
1 3
2 1
3 3

Нужно выбрать object_id, option_id которых равно 1 и 2.

Как это сделать в MySQL? ;)

PS На первый взгляд, все очень просто, но почему то не получается…
  • Вопрос задан
  • 3113 просмотров
Подписаться 4 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 5
SELECT object_id FROM object_option WHERE option_id IN (1, 2)
Ответ написан
@Ualde
Во-первых, как может быть два primary key?

Во-вторых, сколько не искал подвоха, не нашел:
select * from `object_option` where `object_id` in(1, 2) and `option_id` in(1, 2);
Ответ написан
@egorinsk
SELECt fields FROM table WHERE option_id IN (1,2) UNION SELECT fields FROM table WHERE object_id IN (1,2)

Такой подход позволит использовать индексы (если они есть) вместо перебора всех строк таблицы (при использовании OR)
Ответ написан
@uoYkcuF
>Нужно выбрать из таблицы такие object_id, option_id которых равны одновременно нескольким значениям.

select o.object_id as object_id
from object_option o
INNER JOIN object_option o2 on o2.object_id = o.object_id
WHERE o2.option_id != o.option_id
GROUP BY o.object_id
Ответ написан
Комментировать
grefon
@grefon
Сейчас образовалась похожая задача. Вы случайно не нашли решения?
Мне в голову пришло только обработать запрос через темповую функцию:

SELECT object_id, GROUP_CONCAT(option_id) AS temp FROM object_option WHERE option_id IN (1, 2) GROUP BY object_id HAVING temp = '1,2'


Получается, что мы объединяем в группу все опции объекта и получаем переменную temp. Далее сравниваем эту переменную с набором нужных нам опций. Если Вы нашли более деликатное решение, то поделитесь, пожалуйста ))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы