1

アルコール カテゴリとジョブ番号によって yes/no カウントを表示するストアド プロシージャを作成しています。現在のカテゴリ (ワイン、ビール、ウィスキー) のプログラミングをユニオンを介して開始しましたが、さらに多くのカテゴリが存在する可能性があることを考えて、このコードのサイズが非常に大きくなるのを視覚化しました。ループ内でユニオンをすべて実行してから、アルコール カテゴリの引数を渡すことは可能ですか? インターネットをトロールし、この件についてはほとんど見ていないので、助けやガイダンスがあれば大歓迎です.

私のコードの始まり...

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
4

1 に答える 1

0

理論的には、クエリ文字列をループで構築し、それを準備済みステートメントとして実行するループを作成できます。ただし、そうするのは悪い習慣です。代わりに、アルコール カテゴリごとに異なる列を作成することは避けてください。複数の行で単一の列を使用します。各行には、jobid、アルコール カテゴリ、および値 (1 または 2 など) が含まれます。

*_id別のテーブルの行の識別子ではなく、はい/いいえの情報を保存しているように見えるため、列が と呼ばれる理由が少しわかりません。誤解を招きにくい名前を選択することをお勧めします。

カテゴリには、、enum文字列に格納された名前、または種類をリストする他のテーブルの主キーを参照する番号を使用できます。これenumは、すべての新しいカテゴリでデータベース スキーマを変更する必要があることを意味します。特に長い名前を選択した場合、文字列はかなりの量のメモリを消費する可能性があります。したがって、別のテーブルへの参照は最も柔軟なソリューションであり、長期的にはおそらく最良の選択です。

拡張されたテーブルに基づいて、現在の構造をビューとして提供することもできます。再構築されたテーブルに新しい名前を使用し、このビューに現在の名前を再利用すると、既存のコードとの下位互換性を維持できます。

ちょっとした注意: MySQL は 0 または 1 を使用してブール値を表します。したがって、書く代わりに、case when foo=bar then 1 else 0 end単に書くことができますfoo=bar。これにより、コードが大幅に短くなります。おっと、一見すると読みづらくなるので、この使用法についてどこかにコメントを残すのが最善でしょう。

于 2012-10-18T21:30:28.647 に答える