我该如何写这个查询?

时间:2011-11-28 10:27:20

标签: php mysql

我有以下mysql表:

map_id - module_id - category_id
1      -     3     -     6
2      -     3     -     9
3      -     3     -     11
4      -     4     -     6
5      -     4     -     9
6      -     4     -     12

map_id是主键。我在数组中有一个category_id列表。

我的选择标准是:

  • 如果module_id = 3, 4数组包含6,9。
  • ,则应返回category_id
  • 如果module_id = 3数组包含6,9,11
  • ,则只应返回category_id

现在,如果我运行一个简单的WHERE...IN查询,那么所有行都会被选中,这不是我想要的。

编辑:实际上我一直在寻找更具动态性的解决方案。可能我的问题不明确(这是我的第一个)。

说我有这些category_id:

$cat = array(6,9)

如果我查询

"SELECT module_id FROM maptable WHERE category_id IN (".implode(',', $cat).")"

然后我得到了包含module_id 3和4的行。

另一方面,如果数组是

$cat = array(6,9,11)

我运行相同的查询,我再次获得相同的结果。但是我这次只想要module_id = 3的行。

4 个答案:

答案 0 :(得分:4)

SQL并不是真的设计用于这样的查询,但可以完成。

SELECT module_id FROM
(SELECT module_id FROM table WHERE category_id = 6) cat_6
JOIN (SELECT module_id FROM table WHERE category_id =  9)  cat_9 USING (module_id)
JOIN (SELECT module_id FROM table WHERE category_id = 11) cat_11 USING (module_id)

确保category_id, module_id上有索引,module_id, category_id上有第二个索引。理想情况下,您可以制作这些独特的索引。

答案 1 :(得分:0)

WHERE ((category_id = 6 OR category_id=9) AND module_id=3) OR ((category_id = 6 OR category_id=9 OR category_id = 11) AND (module_id=3 OR module_id=4))

这可能是一种更简单的写作方式,但我认为你明白了这一点: - )

答案 2 :(得分:0)

当你使用WHERE ... IN时它意味着'任何in(...)value'

您可以使用AND代替

答案 3 :(得分:0)

你可以尝试:

SELECT * FROM `table`
WHERE (`module_id` IN(3,4) AND `category_id` IN(6,9))
   OR (`module_id` IN(3) AND `category_id` IN(6,9,11))