我错误地将优先级存储为列中的逗号分隔列表,更进一步,甚至没有正确设置 例如我有以下数据
programs
HID
HID,IWREM
IWREM,ENVENG
ENVENG,HID
HID,ENVENG,IWREM
IWREM
现在我需要的是使它成为一个正确的逗号分隔列表,正确的意思是所有值中都应该有两个逗号(因为有三个程序),例如第一个值HID应该是HID,第二个值应该是HID,IWREM,
这是必需的,因为我想运行这样的查询:
/* 2nd Priority Stats */
select
sum(case when program like '%,HID%' then 1 else 0 end) as `IWRM`,
sum(case when program like '%,IWRM%' then 1 else 0 end) as `IWRM`,
sum(case when program like '%,ENVENG%' then 1 else 0 end) as `ENVENG`
from table where degree = 'me';
同样地,我想要所有三个优先级的统计数据。
我总共有3个课程,学生可以注册,即HID,IWREN,ENVENG。他们是例如隐藏的是液压,灌溉和排水等
Schema是一个非常简单的学生表,包含id,name,fathers name,program,degree和其他字段。 学生可以选择一个课程,两个或全部三个。如果选择了多个,则必须指定优先级。当前的PHP代码只将程序插入为逗号分隔列表,但是如果学生只选择一个程序,则没有逗号分隔列表,而对于两个程序,只有两个列,而不是全部三个。
答案 0 :(得分:0)
嗯。你的数据结构都搞砸了。它应该是三列,或者是每个实体有三行的联结表。也就是说,我不知道为什么你需要改变任何东西。为什么不使用正确的内置函数?
select sum(find_in_set('HID', program) > 0) as `HID`,
sum(find_in_set('IWRM', program) > 0) as `IWRM`,
sum(find_in_set('ENVENG', program) > 0) as `ENVENG`
from table
where degree = 'me';
在MySQL中,您不需要case
来计算布尔表达式的匹配数。
答案 1 :(得分:0)
由于我需要快速解决方案而不需要更改过多的PHP代码来进行数据插入和读取,因此我通过正确添加2个逗号进行了修复。 现在数据看起来像这样:
id program
1 "ENVENG,IWRM,HID"
3 "ENVENG,,"
9 "IWRM,,"
13 "HID,IWRM,"
18 "ENVENG,,"
21 "IWRM,HID,"
23 "HID,,"
27 "ENVENG,,"
我现在可以使用select with query来汇总用于morris图表的数据:
select
sum(case when program like '%,HID,%' then 1 else 0 end) as `IWRM`,
sum(case when program like '%,IWRM,%' then 1 else 0 end) as `IWRM`,
sum(case when program like '%,ENVENG,%' then 1 else 0 end) as `ENVENG`
from table where degree = 'me';
然而,如果我有4个或更多的程序,这不起作用,除了这个技术只是糟透了。所以@gordon Linoff& @Drew Pierce建议,它应该是联结表
你的意思是这样的:
Student table (junction, lookup or i dont know)
Id PID
1 3
1 2
1 1
3 3
9 2
13 1
13 2
....
Program Table
PID Program
1 HID
2 IWREM
3 ENVENG
OR
Student Table
Id program (pri-keys from program table)
1 3,2,1
3 3
9 2
13 1,2
18 3
21 2,1
......