Предположим, это веб-сайт, который продает фотоаппараты.Вот мои сущности (таблицы):
Camera: A simple camera
Feature: A feature like: 6mp, max resolution 1024x768,
Дело в том, что между камерами и функцией у меня есть отношение многие ко многим, поэтому у меня есть дополнительная таблица:
camera -> cameras_features -> feature
Итак, запрос прост:
Как получить все камеры, имеющие функцию 1,2 и 3?
Это похоже на создание индекса растрового изображения.
Данные, которые можно использовать для проверки правильности решения
C1 has features 1,2,3
C2 has features 1,2,4
C3 has features 1,2
Вот запросы и ожидаемый результат:
- Показать все камеры с функциями 1,2 и 3: C1
- Показать все камеры с функциями 1,2 и 4: C2
- Показать все камеры, которые имеют функции 1 и 2: C1 , C2 и C3
Вот что я сделал (это работает, но это действительно ужасно, я не хочу его использовать):
SELECT * FROM camera c
WHERE c.id IN (
(SELECT c.id FROM camera c JOIN cameras_features f ON (c.id=f.camera_id)
WHERE f.feature_id=1)
q1 JOIN -- simple intersect
(SELECT c.id FROM camera c JOIN cameras_features f ON (c.id=f.camera_id)
WHERE f.feature_id=2)
q2 JOIN ON (q1.id=q2.id)
)