您能在MySQL查询中拆分/爆炸一个字段吗?

您能在MySQL查询中拆分/爆炸一个字段吗?

我要写一份关于一些学生完成情况的报告。每个学生都属于一个客户。以下是表格(简化为这个问题)。

CREATE TABLE  `clients` (
  `clientId` int(10) unsigned NOT NULL auto_increment,
  `clientName` varchar(100) NOT NULL default '',
  `courseNames` varchar(255) NOT NULL default '')

这个courseNames字段包含以逗号分隔的课程名称字符串,如“ab 01、ab 02、ab 03”。

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字段在这里Clients.CourseNames字段中课程名称的索引..所以,如果客户courseNames是“ab01,ab02,ab03”,以及courseId报名人数是2,然后学生在AB 03。

是否有一种方法可以对这些表进行一个包含课程名称的选择?请记住,会有来自不同客户的学生(因此有不同的课程名称,并不是所有的课程名称都是顺序的,例如:“NW 01,NW 03”)

基本上,如果我可以拆分该字段并从结果数组中返回一个元素,这就是我所要寻找的。我的意思是用神奇的伪码:

SELECT e.`studentId`, SPLIT(",", c.`courseNames`)[e.`courseId`]FROM ...


Cats萌萌
浏览 860回答 3
3回答

眼眸繁星

直到现在,我还想在我的SQLdb中保留那些逗号分隔的列表-很好地知道所有的警告!我一直认为它们比查找表(它提供了一种规范化数据库的方法)有好处。经过几天的拒绝,我见过光:在一个字段中使用逗号分隔的值时,使用查找表不会导致比那些难看的字符串操作更多的代码。查找表允许本地数字格式,因此不大于那些CSV字段。不过,它要小一些。在高级语言代码(SQL和PHP)中,所涉及的字符串操作很小,但与使用整数数组相比代价很高。数据库并不是人类所能阅读的,因为它们的可读性/直接可编辑性,所以试图坚持它们的结构是愚蠢的,就像我所做的那样。简而言之,MySQL中没有本机splp()函数是有原因的。

慕尼黑8549860

考虑到这是一个很受欢迎的问题-答案是肯定的。列column表中table包含所有昏迷分离值:CREATE TEMPORARY TABLE temp (val CHAR(255));SET @S1 = CONCAT("INSERT INTO temp (val) VALUES ('",REPLACE((SELECT GROUP_CONCAT( DISTINCT   `column`) AS data FROM `table`), ",", "'),('"),"');");PREPARE stmt1 FROM @s1;EXECUTE stmt1;SELECT DISTINCT(val) FROM temp;请记住不在数据库中存储CSVper@mark amery-因为这会将昏迷分离值转换为INSERT语句时,在未清除的数据上运行时要小心。请重申一下别将CSV存储在DB中;此函数的目的是将CSV转换为合理的DB结构,而不是在代码中的任何地方使用。如果您必须在生产中使用它,请重新考虑您的DB结构。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MySQL