我的学校管理软件有问题。
我必须计算一名教师在一周内有多少个班级,为此,管理员可以为一个班级分配多个教师,并且通过他们的ids将选定的教师插入数据库。如果有多名教师,则将它们插入用逗号分隔的单列中。
我得数数一名教师的班级总数。
我怎么能创建这样的查询?
mysql_num_rows(mysql_query("select * from table_teacher where employee_id in (1))
发布于 2017-08-24 07:21:38
造成问题的根本原因是数据库没有标准化。假设您的桌子看起来像:
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');正确的做法是将其规范化为两个表:
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的行就足够了。
SELECT COUNT(1)
FROM COURSE_TEACHERS
WHERE TEACHER_ID = 1;这样的问题不仅更容易提出,而且查询效率也要高得多,因为它们可以以在当前模型中不可能的方式使用索引。
这就是说,如果您知道教师字符串总是看起来像--例如:
‘1,2,5,’
您可以使用LIKE来计数行:
SELECT COUNT(1)
FROM COURSES WHERE TEACHERS LIKE '% 2,%';陷阱,如果最后一项未用分隔符令牌终止(在本例中为","),则需要在一个特殊谓词中处理该问题。对于start项目也是如此,它需要以与其余项目相同的方式启动。
如果您不能相信字符串在这个简单的形式中,您可能会找到一个正则表达式来描述教师列表中的教师项。
发布于 2017-08-24 11:53:17
如果字段用逗号分隔,则可以使用mysql字符串函数"FIND_IN_SET“而不是类似的查询。参考链接https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_发现集
您的查询应该是
SELECT COUNT(1)
FROM COURSES WHERE FIND_IN_SET('2',TEACHERS);https://dba.stackexchange.com/questions/184229
复制相似问题