我必须就一些学生的完成情况创建一份报告。每个学生都属于一个客户。这是表格(此问题的简化版)。
CREATE TABLE clients
( clientId
int(10) unsigned NOT NULL auto_increment, clientName
varchar(100) NOT NULL default '', courseNames
varchar(255) NOT NULL default '' ) 该courseNames字段包含课程名称的逗号分隔字符串,例如“ AB01,AB02,AB03”
CREATE TABLE clientenrols
( clientEnrolId
int(10) unsigned NOT NULL auto_increment, studentId
int(10) unsigned NOT NULL default '0', courseId
tinyint(3) unsigned NOT NULL default '0' ) courseId此处的字段是client.courseNames字段中课程名称的索引。因此,如果客户的名称courseNames是“ AB01,AB02,AB03”,而courseId注册的名称是2,则该学生在AB03中。
有什么办法可以对这些包含课程名称的表格进行单选吗?请记住,会有来自不同客户的学生(因此具有不同的课程名称,并非所有课程名称都是连续的,例如:“ NW01,NW03”)
基本上,如果我可以拆分该字段并从结果数组中返回单个元素,那将是我想要的。这就是神奇的伪代码的意思:
SELECT e.studentId
, SPLIT(",", c.courseNames
)[e.courseId
] FROM ...
到目前为止,我想将那些逗号分隔的列表保留在我的SQL数据库中-充分了解所有警告!
我一直认为它们比查找表有优势(查找表为标准化数据库提供了一种方法)。经过几天的拒绝,我看到了曙光:
当在一个字段中使用逗号分隔的值时,使用查找表不会比丑陋的字符串操作引起更多的代码。 查找表允许使用本机数字格式,因此不能大于这些csv字段。虽然是更小。 所涉及的字符串操作在高级语言代码(SQL和PHP)中比较薄,但是与使用整数数组相比,开销很大。 数据库并不是人类可读的,并且像我所做的那样,试图坚持使用结构通常是愚蠢的,因为它们具有可读性/直接可编辑性。 简而言之,MySQL中没有本机SPLIT()函数是有原因的。来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。