首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果单个列包含由逗号分隔的多个值,则计数总匹配id。

问如果单个列包含由逗号分隔的多个值,则计数总匹配id。
EN

Database Administration用户
提问于 2017-08-24 06:20:03
回答 2查看 1.8K关注 0票数 0

我的学校管理软件有问题。

我必须计算一名教师在一周内有多少个班级,为此,管理员可以为一个班级分配多个教师,并且通过他们的ids将选定的教师插入数据库。如果有多名教师,则将它们插入用逗号分隔的单列中。

我得数数一名教师的班级总数。

我怎么能创建这样的查询?

mysql_num_rows(mysql_query("select * from table_teacher where employee_id in (1))

EN

回答 2

Database Administration用户

发布于 2017-08-24 07:21:38

造成问题的根本原因是数据库没有标准化。假设您的桌子看起来像:

代码语言:javascript
复制
CREATE TABLE COURSES
( APPLICATION_CODE ... NOT NULL PRIMARY KEY
, ...
, TEACHERS VARCHAR(100) NOT NULL );

INSERT INTO COURSES (APPLICATION_CODE, TEACHERS)
VALUES ('MA101', '1,2,5');

正确的做法是将其规范化为两个表:

代码语言:javascript
复制
CREATE TABLE COURSES
( APPLICATION_CODE ... NOT NULL PRIMARY KEY
, ... );

CREATE TABLE COURSE_TEACHERS
( APPLICATION_CODE ... NOT NULL 
, TEACHER_ID INT NOT NULL 
,     PRIMARY KEY (APPLICATION_CODE, TEACHER_ID) );

INSERT INTO COURSES (APPLICATION_CODE)
VALUES ('MA101');

INSERT INTO COURSE_TEACHERS (APPLICATION_CODE, TEACHER_ID)
VALUES ('MA101', 1), ('MA101', 2), ('MA101', 5);

在这种情况下,只要计算TEACHER_ID =1的行就足够了。

代码语言:javascript
复制
SELECT COUNT(1) 
FROM COURSE_TEACHERS
WHERE TEACHER_ID = 1;

这样的问题不仅更容易提出,而且查询效率也要高得多,因为它们可以以在当前模型中不可能的方式使用索引。

这就是说,如果您知道教师字符串总是看起来像--例如:

‘1,2,5,’

您可以使用LIKE来计数行:

代码语言:javascript
复制
SELECT COUNT(1) 
FROM COURSES WHERE TEACHERS LIKE '% 2,%';

陷阱,如果最后一项未用分隔符令牌终止(在本例中为","),则需要在一个特殊谓词中处理该问题。对于start项目也是如此,它需要以与其余项目相同的方式启动。

如果您不能相信字符串在这个简单的形式中,您可能会找到一个正则表达式来描述教师列表中的教师项。

票数 2
EN

Database Administration用户

发布于 2017-08-24 11:53:17

如果字段用逗号分隔,则可以使用mysql字符串函数"FIND_IN_SET“而不是类似的查询。参考链接https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_发现集

您的查询应该是

代码语言:javascript
复制
SELECT COUNT(1) 
FROM COURSES WHERE FIND_IN_SET('2',TEACHERS);
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/184229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档