Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php sql字符串字段包含一个id_Php_Mysql_Sql - Fatal编程技术网

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)