sql string字段包含id

时间:2014-02-20 16:02:18

标签: php mysql sql

我的数据库中有一个表projects。 在此表中有一行categories,其中是项目所在的所有categories_id。例如,项目属于类别1和2,因此行值为1,2。 我想要的是计算一个类别中的所有项目。所以我试试这个:

select * from `projects` WHERE '{$id_cat}' IN (`categories`) 

但它不计算具有多个类别的项目。我不想使用LIKE

select * from `projects` WHERE `categories` LIKE '%{$id_cat}%'

因为例如,如果我有一个类别为11的项目,并且我尝试查找类别1中的所有项目,则此查询也将返回此值。

2 个答案:

答案 0 :(得分:1)

在MySQL中,您可以使用find_in_set()执行此操作。不过,首先,您可以通过在双方添加分隔符来使like工作:

select *
from `projects`
WHERE concat(',', `categories`, ',') LIKE '%,{$id_cat},%';

等效find_in_set()是:

select *
from `projects`
WHERE find_in_set($id_cat, categories) > 0;

答案 1 :(得分:0)

我建议您重新构建数据库,因为在连接字符串中存储外键的ID会继续导致问题。

例如,假设您的数据库结构是这样的(我暂时没有完成MySQL,所以可以在这里更正我的语法):

Table: Project
--------------
ID   - INT (PK)
Name -  VARCHAR

Table: Category
---------------
ID   - INT (PK)
Name -  VARCHAR

你会有一个像这样结构的连接表:

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设为compound primary key,如in this question所示。