2011-05-04 58 views
1

原来的问题是以下开发MySQL的问题:其中A IN()和IN() - 从其中A = 1和A = 2返回0行

Where A=1 AND A=2 returns 0 row problem - (Short Mysql question)

感谢一些有用的答案。 (但很快我意识到我可能过于简单化的问题)

其实真正的问题是:

Tag 1,2,3 - category A 
Tag 4,5,6 - category B 
Tag 7,8,9 - category C 

我要实现“OR条件”为同一类别,但“AND条件”为不同的类别。 所以我可能要返回类似

-- I want id with Tag 1,4 or 1,2,4 but not 4 
SELECT id FROM table WHERE Tag IN (1,2) AND Tag (4) 

-- Tag 1,4 or 1,5 but not 1 
SELECT id FROM table WHERE Tag IN (1) AND Tag (4,5) 

-- Only Tag 1,4,9 
SELECT id FROM table WHERE Tag IN (1) AND Tag (4) AND Tag (9) 

我试图从答案弄清楚,但任何快速指南,将不胜感激!

回答

1

从我的理解要返回的标签的ID至少在2个不同的分类上,试试这个:

Select id from Table 
WHERE tag_category in (A,B,C) 
Group by id 
Having count(distinct tag_category) >= 2 
+0

这有帮助。谢谢! – user706087 2011-05-05 01:26:32

0

这听起来像你有'必须有'的条件,但你只想选择那些在你的可选列表中。

试试这个:

SELECT id from Table 
WHERE Tag IN (1,2) 
AND EXISTS (SELECT 1 FROM Table WHERE Tag=4) 

目前还不清楚您的源数据的样子。你能澄清吗?

1

听起来像是你想已经标记与给定的标签ID(只有那些被标记了所有给定的标签ID),这些类别:

Select id from Table 
WHERE tag in (A,B,C) 
Group by id 
Having count(id)>=3 
+0

这有帮助。谢谢! – user706087 2011-05-05 01:27:05

0

这与我之前回答的问题基本相同。

区别在于HAVING条款。现在它为每个标签组分配一个不同的编号。所以id in (1,2)的编号是1else子句适用于标签号4,这些标签的组号为2。然后,它计算该id的不同标签组号的数量,并且只返回id,其计数为2意味着两个标签组都存在。

SELECT id 
FROM table 
WHERE Tag in (1,2,4) 
GROUP BY id 
HAVING COUNT(DISTINCT CASE WHEN Tag in (1,2) THEN 1 ELSE 2 END) = 2  
+0

其他2个查询对于动态生成的代码看起来更简单。 (查询必须随着类别的增长而生成)但是,还是谢谢。你们都激励我完成我的代码。 :) – user706087 2011-05-05 01:30:44

+0

@user - 另外两个你认为有帮助的评论并不像他们会对我有用! – 2011-05-05 09:26:30