我的数据库中有一个表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中的所有项目,则此查询也将返回此值。
答案 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所示。