循环使用联盟全部

时间:2012-10-18 18:56:35

标签: 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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

小注:MySQL使用0或1来表示布尔值。因此,您只需撰写case when foo=bar then 1 else 0 end,而不是撰写foo=bar。这将使您的代码更短。 Otoh,乍看之下也会让人难以阅读,所以也许最好在某个地方就此用途发表评论。