Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 联合循环_Mysql - Fatal编程技术网

Mysql 联合循环

Mysql 联合循环,mysql,Mysql,我正在编写一个存储过程,它将按酒精类别和工作编号显示是/否计数。我开始通过一个联盟对当前的类别(葡萄酒、啤酒、威士忌)进行编程,但考虑到未来可能会有更多的类别,我设想这段代码的规模会越来越大。是否可以在循环中执行联合,然后传递酒精类别参数?我在互联网上浏览过,很少看到这方面的内容,因此,任何帮助或指导都将不胜感激 我的代码的开始 delimiter $$ create procedure alc_cat_yn (in jid int) begin select cast(concat(jobid

我正在编写一个存储过程,它将按酒精类别和工作编号显示是/否计数。我开始通过一个联盟对当前的类别(葡萄酒、啤酒、威士忌)进行编程,但考虑到未来可能会有更多的类别,我设想这段代码的规模会越来越大。是否可以在循环中执行联合,然后传递酒精类别参数?我在互联网上浏览过,很少看到这方面的内容,因此,任何帮助或指导都将不胜感激

我的代码的开始

delimiter $$
create procedure alc_cat_yn (in jid int)
begin
select
cast(concat(jobid,' - Wine') 
as char(50)) as `Job Number - Consumed Yesterday`
,sum(case when wine_id=1 then 1 else 0 end) as y
,sum(case when wine_id=2 then 1 else 0 end) as n
from demos
where jobid=jid
group by jobid
union all
select
cast(concat(jobid,' - Beer') 
as char(50)) as `Job Number - Consumed Yesterday`
,sum(case when beer_id=1 then 1 else 0 end) as y
,sum(case when beer_id=2 then 1 else 0 end) as n
from demos
where jobid=jid
group by jobid
union all
select
cast(concat(jobid,' - Whisky') 
as char(50)) as `Job Number - Consumed Yesterday`
,sum(case when whisky_id=1 then 1 else 0 end) as y
,sum(case when whisky_id=2 then 1 else 0 end) as n
from demos
where jobid=jid
group by jobid;
end

理论上,您可以有一个循环,它在循环中构建查询字符串,并将其作为准备好的语句执行。然而,这样做是不好的做法。相反,你应该避免为不同的酒精类别设置不同的栏目。使用一列多行。每行将包含jobid、酒精类别和一个值(例如1或2)

我有点不解为什么您的列被称为
*\u id
,因为您似乎存储了一些是/否信息,而不是另一个表中某行的标识符。您可能希望选择一个不太容易引起误解的名称

对于类别,您可以使用
枚举
,或存储在字符串中的名称,或引用列出您的类别的其他某些表的主键的数字。
enum
意味着每个新类别都需要更改数据库模式。字符串可能会消耗大量内存,特别是在选择长名称时。因此,对另一个表的引用是最灵活的解决方案,从长远来看可能是您的最佳选择

您仍然可以基于扩展表以视图的形式提供当前结构。如果为重构后的表使用新名称,并为此视图重用当前名称,则可以保持与现有代码的向后兼容性


注意:MySQL使用0或1表示布尔值。因此,当foo=bar然后1 else 0 end时,您可以简单地编写
foo=bar
,而不是编写
case。这将使您的代码更短。Otoh,这也会使乍一看起来更难阅读,因此最好在某个地方发表关于此用法的评论。

您在这里遇到困难的原因是您的模式没有正确规范化。您不应该在
demos
表中有特定的
wine\u id
beer\u id
whisky\u id
列。在工作和酒精类别之间有着多对多的关系,你可以在互联网上搜索技术,使之正常化。