[英]How do I write this query?
我有以下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
列表。
我的选择标准是:
category_id
数组包含6,9 module_id = 3, 4
则应返回module_id = 3, 4
。 category_id
数组包含6,9,11,则只应返回module_id = 3
现在,如果我运行一个简单的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的行。
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
上有第二个索引。 理想情况下,您可以制作这些唯
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))
?
这可能是一种更简单的写作方式,但我认为你明白了这一点:-)
当你使用WHERE ... IN时它意味着'任何in(...)value'
你可以使用AND代替
你可以尝试:
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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.