你能解决这个简单的SQL查询吗?

san*_*lto 2 mysql sql relational-division sql-match-all

假设它是一个销售照相机的网站.这是我的实体(表格):

Camera: A simple camera
Feature: A feature like: 6mp, max resolution 1024x768, 
Run Code Online (Sandbox Code Playgroud)

事情是相机和功能之间我有多对多的关系,所以我有一个额外的表:

camera -> cameras_features -> feature
Run Code Online (Sandbox Code Playgroud)

所以,查询很简单:

如何获得具有1,2和3功能的所有相机?

这就像构建位图索引一样.

您可以用来测试解决方案是否正常的数据

C1 has features 1,2,3
C2 has features 1,2,4
C3 has features 1,2
Run Code Online (Sandbox Code Playgroud)

以下是查询和预期结果:

  • 显示所有具有功能1,2和3的摄像机: C1
  • 显示所有具有1,2和4功能的摄像机: C2
  • 显示所有具有功能1和2的摄像机: C1,C2C3

这是我做的(它的工作原理,但它真的很难看,不想使用它):

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)
)
Run Code Online (Sandbox Code Playgroud)

Mic*_*ker 5

SELECT camera.id
FROM camera JOIN camera_features ON camera.id=camera_features.camera_id
GROUP BY camera.id
HAVING sum(camera_features.feature_id IN (1,2,3))=3
Run Code Online (Sandbox Code Playgroud)

3是的功能数量(1,2,3).假设(camera_id,feature_id)是独一无二的camera_features.