2012-03-13 36 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