Php sql字符串字段包含一个id
我的数据库中有一个表Php sql字符串字段包含一个id,php,mysql,sql,Php,Mysql,Sql,我的数据库中有一个表projects。 此表中有一行categories,其中是项目所在的所有类别id。例如,项目属于类别1和类别2,因此行值为1,2。 我想要的是统计一个类别中的所有项目。所以我试着这样做: select * from `projects` WHERE '{$id_cat}' IN (`categories`) 但它不包括具有多个类别的项目。我不想像 select * from `projects` WHERE `categories` LIKE '%{$id_cat}%'
projects
。
此表中有一行categories
,其中是项目所在的所有类别id。例如,项目属于类别1和类别2,因此行值为1,2
。
我想要的是统计一个类别中的所有项目。所以我试着这样做:
select * from `projects` WHERE '{$id_cat}' IN (`categories`)
但它不包括具有多个类别的项目。我不想像
select * from `projects` WHERE `categories` LIKE '%{$id_cat}%'
因为,例如,如果我有一个属于类别11的项目,并且我尝试查找类别1中的所有项目,那么这个查询也会返回这个值 在MySQL中,您可以使用
在\u集合中查找()
执行此操作。不过,首先,您可以通过在两侧添加分隔符,使与类似:
select *
from `projects`
WHERE concat(',', `categories`, ',') LIKE '%,{$id_cat},%';
等价的find_in_set()
是:
select *
from `projects`
WHERE find_in_set($id_cat, categories) > 0;
我建议您重新构建数据库,因为在串联字符串中存储外键的int-ID将继续给您带来问题
例如,假设您的数据库结构是这样的(我已经有一段时间没有使用MySQL了,请随意更正我的语法):
您将拥有如下结构的联接表:
Table: ProjectCategoryLookup
----------------------------
CategoryID - INT (FK to Category.ID)
ProjectID - INT (FK to Project.ID)
然后,您可以通过以下方式返回类别ID上的项目:
SELECT * FROM Projects P
INNER JOIN ProjectCategoryLookUp LKP ON P.ID = LKP.ProjectID
WHERE LKP.CategoryID IN (11, 12)
理想情况下,您应该为ProjectCategoryLookup创建CategoryID和ProjectID,如图所示。为什么不使用like?最好有一个项目/类别查找表。在这样的字符串字段中存储多个int-ID只会继续给您带来问题。您在_集中找到_了吗?@Kuzgun,因为如果我想要类别1
中的项目,如果我使用like
它将返回多个类别中的项目。例如,类别11
或21
等我完全同意你的观点,但不幸的是,我不能修改数据库,我只需要做一些统计,而不改变结构中的任何内容。不管怎样,谢谢你的回答。最后我用了比如。起初我避免使用它,因为开头和结尾都没有逗号,但你的想法很棒。谢谢
SELECT * FROM Projects P
INNER JOIN ProjectCategoryLookUp LKP ON P.ID = LKP.ProjectID
WHERE LKP.CategoryID IN (11, 12)