通过在MySQL中搜索多个列和多个值来选择行

通过在MySQL中搜索多个列和多个值来选择行,mysql,sql,Mysql,Sql,我有这张桌子 file_id cat_1 cat_2 cat_3 cat1,cat2,cat3都包含类别ID。 我想选择存在于cat1或cat2或cat3 简单查询是: SELECT file_id FROM files WHERE cat_1 IN (1,2,3,4,5) OR cat_2 IN (1,2,3,4,5) OR cat_3 IN (1,2,3,4,5) 这不是更好的方法吗?例如,将所有列放在另一个列表中 WHERE (cat_1,cat_2,cat_3)

我有这张桌子

file_id    cat_1    cat_2    cat_3
cat1
cat2
cat3
都包含类别ID。
我想选择存在于
cat1
cat2
cat3

简单查询是:

SELECT file_id FROM files WHERE 
cat_1 IN (1,2,3,4,5)
OR cat_2 IN (1,2,3,4,5)
OR cat_3 IN (1,2,3,4,5)
这不是更好的方法吗?例如,将所有列放在另一个列表中

WHERE (cat_1,cat_2,cat_3) IN (1,2,3,4,5) ?

更好的数据库设计是

files table
-----------
id
name
...


categories table
----------------
id
name
...


file_categories table
---------------------
file_id
category_id
这样,每个文件可以存储任意数量的类别。要获取特定类别的所有文件,可以执行以下操作

select f.*
from files f
join file_categories fc on fc.file_id = f.id
join categories c on fc.category_id = c.id
where c.name = 'cat 1'
或者,如果您已经有了
category\u id
s列表,请执行以下操作

select f.*
from files f
join file_categories fc on fc.file_id = f.id
where fc.category_id in (1,2,3,4,5)

有一种更好的方法可以做到这一点。它被称为规范化数据,因此每个类别和文件有一行连接表。