全部循环

  • 本文关键字:循环 全部 mysql
  • 更新时间 :
  • 英文 :


我正在编写一个存储过程,该过程将以酒精类别和工作编号显示是/否计数。我开始通过工会对当前类别进行编程 - 葡萄酒,啤酒,威士忌 - 几乎没有想到可能会有更多类别,我想象着这一代码的规模大大。是否可以在循环中执行所有联盟,然后通过酒精类别的论点?在互联网上拖曳了互联网,对这个主题的看法很少,因此将不胜感激的任何帮助或指导。

我代码的开始...

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)。

我有点讨厌为什么您的列被称为*_id,因为您似乎存储了一些是/否信息,而不是另一个表中某些行的标识符。您可能需要选择一个误导性的名称。

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

您仍然可以根据扩展表提供当前的结构作为视图。如果您为重组表使用新名称,并重复使用此视图的当前名称,则可以维护与现有代码的向后兼容性。

小注意:mySQL使用0或1表示布尔值。因此,您可以简单地编写foo=bar,而不是编写case when foo=bar then 1 else 0 end。这将使您的代码短得多。OTOH,这也将使乍一看很难阅读,因此也许最好在此处发表评论。

相关内容

最新更新