Предположим, это веб-сайт, на котором продаются фотоаппараты. Вот мои сущности (таблицы):
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)
)