2011-05-25 40 views
2

有没有办法实现的东西,如:MYSQL子集操作

SELECT * 
FROM tb_values 
WHERE (value1, value2, value3) SUBSET_OF 
    (SELECT value 
     FROM tb_value 
     WHERE isgoodvalue = true 
    ) 

更多信息: 我有一个表称为项目。每个项目都有标签。标签可以由多个项目共享。有一个名为projectTagMap的映射表。现在用户使用标签来过滤项目。使用用户界面上的复选框选择标签。所以用户选择几个标签来过滤项目。我应该从项目表中选择包含用户选择的所有标签的项目。

+1

你的代码来描述你的问题。但是,问题的目的是获得正确的代码。你给出的代码当然不是正确的代码,那么我们应该如何弄清楚你真正想从它得到什么?使用_words_(和图表)。 – 2011-05-25 11:15:19

+0

哪些值是动态的? 'value1,value2,value3'?他们可以是3或更多或更少? – 2011-05-25 11:16:59

+0

value1,value2等是由用户提供的,比如在stackoverflow中,你想选择一个包含所有给定标签集的问题。 (我的情况更复杂) – joshua 2011-05-25 11:42:27

回答

5

从你的伪代码,我想这要检查是否值的(动态的)名单是由提供的另一个列表的子集SELECT。如果是,那么会显示一张整个表格。如果没有,则不会显示行。

这里是如何做到这一点:

SELECT * 
FROM tb_values 
WHERE 
    (SELECT COUNT(DISTINCT value) 
     FROM tb_value 
     WHERE isgoodvalue = true 
     AND value IN (value1, value2, value3) 
    ) = 3 

OP的解释之后更新

SELECT * 
FROM project 
    JOIN 
    (SELECT projectid 
     FROM projectTagMap 
     WHERE isgoodvalue = true 
     AND tag IN (tag1, tag2, tag3) 
     GROUP BY projectid 
     HAVING COUNT(*) = 3 
    ) AS ok 
    ON ok.projectid = project.id 
0

可能是一个原始的方法,但是我想你可以这样做:

WHERE value1 IN (SELECT value FROM tb_value WHERE isgoodvalue = true) OR value2 IN (...) ... 
+0

感谢Mike,但是我的值列表是动态的。由用户提供 – joshua 2011-05-25 08:54:50

+0

是的,我有一种感觉,它可能是动态的,不知道一种方法来做到这一点,而不是动态地在脚本语言中构建查询 – 2011-05-25 09:04:07