我有以下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的行。
答案 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))