2012-02-01 78 views
2

假設它是一個銷售照相機的網站。這裏是我的實體(表):你能解決這個簡單的SQL查詢嗎?

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 

這裏是querys和預期的結果:

  • 顯示所有具有功能1,2攝像機和3:C1
  • 顯示所有具有功能1的相機, 2和4:C2
  • 顯示所有具有的特徵1和2的攝像頭:C1C2C3

這裏是我做了什麼(它的工作原理,但它確實難看,不想使用它):

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) 
) 
+1

我很慚愧,這不是家庭作業,但標籤沒問題。 – santiagobasulto 2012-02-01 20:38:08

回答

3
SELECT DISTINCT Camera.* 
FROM Camera c 
    INNER JOIN cameras_features fc1 ON c.id = fc1.camera_id AND fc1.feature_id = 1 
    INNER JOIN cameras_features fc2 ON c.id = fc2.camera_id AND fc2.feature_id = 2 

這到底是怎麼發生的是,相機會被過濾到攝像機和特點1,則該組中,將相機會被過濾下來的那些與功能2

+3

每個新的搜索ID都需要一個新的JOIN ... – MatBailie 2012-02-01 20:43:38

+1

這個工程!我無法告訴你我現在感覺到的情緒。它看起來與我所做的相似,但是用JOINS的「竅門」,它叫什麼? – santiagobasulto 2012-02-01 20:47:32

+0

而你可能不需要'DISTINCT'。 – 2012-02-01 20:56:12

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 

3(1,2,3)中的功能數量。假設(camera_id,feature_id)camera_features中是唯一的。

+0

那是OK嗎? – santiagobasulto 2012-02-01 20:41:39

+0

這個假設沒問題。事實上,我在這些專欄上有一個UNIQUE。 – santiagobasulto 2012-02-01 20:43:02

+0

不,我已經在考慮了,謝謝,修正。 (那是關於小組的)。 – 2012-02-01 20:43:25

1

這是最簡單的通過將搜索值放到表中來推廣...

INSERT INTO search SELECT 1 
     UNION ALL SELECT 2 
     UNION ALL SELECT 3 

SELECT 
    camera_features.camera_id 
FROM 
    camera_features 
INNER JOIN 
    search 
    ON search.id = camera_features.feature_id 
GROUP BY 
    camera_features.camera_id 
HAVING 
    COUNT(DISTINCT camera_features.feature_id) = (SELECT COUNT(DISTINCT id) FROM search)