繁体   English   中英

我该如何写这个查询?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM