其中A IN()和A IN() - 从哪里开发MySQL问题A = 1 AND A = 2返回0行

时间:2011-05-04 22:20:21

标签: mysql

原始问题如下:

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)

我想从答案中找出答案,但任何快速指南都将不胜感激!

4 个答案:

答案 0 :(得分:1)

听起来你想要那些用给定标签id标记的类别(只有那些用所有给定标签ID标记的类别):

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

答案 1 :(得分:1)

根据我的理解,您希望返回至少标记为2个不同类别的ID,请尝试以下操作:

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

答案 2 :(得分:0)

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

试试这个:

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

目前尚不清楚您的源数据是什么样的。你能说清楚吗?

答案 3 :(得分:0)

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

区别在于HAVING子句。它现在为每个标签组分配不同的编号。因此id in (1,2)的编号为1else子句适用于代码编号4,这些代码的编号为2。然后,它会计算id的不同标记组编号的数量,并且仅返回计数为2的id,这意味着两个标记组都存在。

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