2012-03-13 75 views
0

當我運行這個程序:IN子句選擇所有變量

SELECT * FROM photo 
LEFT JOIN photo_selectedTags 
ON photo.COUNTER = photo_selectedTags.PHOTO_COUNTER 
WHERE photo_selectedTags.TAGS_COUNTER IN (6,192) 

據檢索出TAGS_COUNTER = 6或192

如何從 '照片' 檢索行行,其中TAGS_COUNTER = 6 AND 192?

更正:在爲所有

+2

您是否試圖用IN替換ALL? – supertopi 2012-03-13 19:42:24

+0

我個人會這樣做'WHERE photo_selectedTags.TAGS_COUNTER = 6 AND photo_selectedTags.TAGS_COUNTER = 192' – ScottJShea 2012-03-13 19:44:11

+0

當我使用AND子句時,它不會返回任何行,即使我是積極的存在。我認爲存在的問題是,有一個照片行,但2 photo_selectedTags單行(一個是6,一個是192) – 2012-03-13 19:47:46

回答

1

的基本思路是這樣的:

SELECT PHOTO_COUNTER 
FROM photo_selectedTags 
WHERE TAGS_COUNTER in (6, 192) 
group by PHOTO_COUNTER 
having count(distinct TAGS_COUNTER) = 2 --2 matches # of items in IN clause 

然後,您可以做到這一點,以獲得其餘列:

SELECT * 
from PHOTO_COUNTER 
LEFT JOIN photo_selectedTags 
ON photo.COUNTER = photo_selectedTags.PHOTO_COUNTER 
where photo.COUNTER in (
    SELECT PHOTO_COUNTER 
    FROM photo_selectedTags 
    WHERE TAGS_COUNTER in (6,192) 
    group by PHOTO_COUNTER 
    having count(distinct TAGS_COUNTER) = 2 --2 matches # of items in IN clause 
) a 
+0

當我運行此查詢,它選擇所有的照片和他們所有的標籤,其中該標籤等於6或192碼'SELECT * FROM 照片 LEFT JOIN photo_selectedTags ON photo.COUNTER = photo_selectedTags.PHOTO_COUNTER 其中的照片。 COUNTER在( SELECT PHOTO_COUNTER FROM photo_selectedTags WHERE在(6192) 組TAGS_COUNTER由PHOTO_COUNTER 具有計數(不同TAGS_COUNTER = 2) )' – 2012-03-13 21:13:04

+0

@Jesse我糾正一個錯字,再試。 – RedFilter 2012-03-13 21:21:45

+0

搖滾!現在,它會選擇每個標籤,以便具有4個標籤的照片有四行,我將如何去返回唯一的照片行? (如果有意義的話) – 2012-03-13 21:29:28

0

編輯

現在我明白你想要什麼,DB結構,嘗試這樣的:

SELECT * FROM photo 
LEFT JOIN photo_selectedTags 
ON photo.COUNTER = photo_selectedTags.PHOTO_COUNTER 
WHERE photo_selectedTags.TAGS_COUNTER = 6 AND photo_id IN 
(SELECT photo_id FROM photoSELECT * FROM photo 
LEFT JOIN photo_selectedTags 
ON photo.COUNTER = photo_selectedTags.PHOTO_COUNTER 
WHERE photo_selectedTags.TAGS_COUNTER = 192) 

我不知道是否photo_id是你的桌子的實際領域,但試着去適應你的結構

顯然在冷杉t SELECT請勿插入PHOTO_COUNTER,因爲我永遠都是同樣的價值,並沒有多少意義。

+0

TAGS_COUNTER可以是多個項目,因爲可以是多行。有一個照片行,但有多個標籤(或關鍵字)與其關聯。 – 2012-03-13 19:51:02

+0

@JesseClark在你的問題中閱讀你的第三條評論,我想我是對的。 – DonCallisto 2012-03-13 19:54:12

+0

@CAbbott:是的,我完全瞭解它。但我想這個問題本身並沒有意義。 – DonCallisto 2012-03-13 19:55:41

0

我會建議使用2聯接

SELECT * 
FROM photo 

JOIN photo_selectedTags as photo_selectedTags6 -- this join restricts to 'photo.COUNTER' whic have TAGS_COUNTER = 6 
ON photo.COUNTER = photo_selectedTags6.PHOTO_COUNTER 
AND photo_selectedTags6.TAGS_COUNTER = 6 

JOIN photo_selectedTags as photo_selectedTags192 -- this join restricts to 'photo.COUNTER' whic have TAGS_COUNTER = 192 
ON photo.COUNTER = photo_selectedTags192.PHOTO_COUNTER 
AND photo_selectedTags192.TAGS_COUNTER = 192 



也有可能實現它與一個alytical功能(如果你的數據庫支持)

-- This one works on teradata. Something similar should work on oracle. Don't know about others 
SELECT * 
FROM photo 
LEFT JOIN photo_selectedTags 
ON photo.COUNTER = photo_selectedTags.PHOTO_COUNTER 
QUALIFY max(case when photo_selectedTags.TAGS_COUNTER = 6 then 1 end) over (partition by photo.COUNTER) = 1 
AND max(case when photo_selectedTags.TAGS_COUNTER = 192 then 1 end) over (partition by photo.COUNTER) = 1 

如果您在列表中(除192,6)有多個值,那麼這可能是可行的解決方案

SELECT * 
FROM photo 
JOIN 
(
    SELECT PHOTO_COUNTER, count(distinct TAGS_COUNTER) cnt 
    FROM photo_selectedTags 
    WHERE TAGS_COUNTER in (192,6) 
    HAVING cnt = 2 -- adjust this according to the number of different values 
) as pht 
ON photo.COUNTER = pht.PHOTO_COUNTER 

在子查詢只PHOTO_COUNTERs剩下的都是(192和6),那麼這是加入

+0

謝謝!第一個例子有效,第二個例子與QUALIFY行有關。有沒有辦法將這些結合到一個連接中,還是必須將它們分離出來?我想這可能會博客下來,如果我正在尋找超過2個標籤。 – 2012-03-13 20:09:02