[解決済み] MySQLでパラメータ付きのビューを作成できますか?
質問
このようなビューがあります。
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = 2;
もっと汎用的にしたいのは、2を変数に変えるということです。これを試してみました。
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = @MyVariable;
しかし、MySQLはこれを許さない。
私は醜い回避策を見つけました。
CREATE FUNCTION GetMyVariable() RETURNS INTEGER DETERMINISTIC NO SQL
BEGIN RETURN @MyVariable; END|
そして、ビューは
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = GetMyVariable();
しかし、これは本当にくだらなく見えますし、使い方もくだらなく、ビューを使う前に毎回@MyVariableを設定しなければなりません。
このように使うことができる、解決策はありますか。
SELECT Column FROM MyView(2) WHERE (...)
具体的には以下のような状況です。 拒否されたリクエストに関する情報を格納するテーブルを持っています。
CREATE TABLE Denial
(
Id INTEGER UNSIGNED AUTO_INCREMENT,
PRIMARY KEY(Id),
DateTime DATETIME NOT NULL,
FeatureId MEDIUMINT UNSIGNED NOT NULL,
FOREIGN KEY (FeatureId)
REFERENCES Feature (Id)
ON UPDATE CASCADE ON DELETE RESTRICT,
UserHostId MEDIUMINT UNSIGNED NOT NULL,
FOREIGN KEY (UserHostId)
REFERENCES UserHost (Id)
ON UPDATE CASCADE ON DELETE RESTRICT,
Multiplicity MEDIUMINT UNSIGNED NOT NULL DEFAULT 1,
UNIQUE INDEX DenialIndex (FeatureId, DateTime, UserHostId)
) ENGINE = InnoDB;
多重度とは、同じ秒数の間に記録された同一のリクエストの数のことです。拒否のリストを表示したいのですが、アプリケーションが拒否されると、念のため2回ほど再試行することがあります。そのため、通常、同じユーザーが数秒間に同じ機能で3回拒否された場合、実際には1回の拒否になります。もし、このリクエストを満たすために、もう1つリソースがあれば、次の2回の拒否は起こりません。そこで、拒否をグループ化し、ユーザが拒否をグループ化する時間帯を指定できるようにしたいと思います。例えば、タイムスタンプ1,2,24,26,27,45で拒否があり、ユーザーが4秒より近い拒否をグループ化したい場合、以下のようなものが得られるはずです。1 (x2), 24 (x3), 45 (x1). 実際の拒否の間のスペースは、重複の間のスペースよりはるかに大きいと仮定できます。私は以下の方法でこの問題を解決しました。
CREATE FUNCTION GetDenialMergingTime()
RETURNS INTEGER UNSIGNED
DETERMINISTIC NO SQL
BEGIN
IF ISNULL(@DenialMergingTime) THEN
RETURN 0;
ELSE
RETURN @DenialMergingTime;
END IF;
END|
CREATE VIEW MergedDenialsViewHelper AS
SELECT MIN(Second.DateTime) AS GroupTime,
First.FeatureId,
First.UserHostId,
SUM(Second.Multiplicity) AS MultiplicitySum
FROM Denial AS First
JOIN Denial AS Second
ON First.FeatureId = Second.FeatureId
AND First.UserHostId = Second.UserHostId
AND First.DateTime >= Second.DateTime
AND First.DateTime - Second.DateTime < GetDenialMergingTime()
GROUP BY First.DateTime, First.FeatureId, First.UserHostId, First.Licenses;
CREATE VIEW MergedDenials AS
SELECT GroupTime,
FeatureId,
UserHostId,
MAX(MultiplicitySum) AS MultiplicitySum
FROM MergedDenialsViewHelper
GROUP BY GroupTime, FeatureId, UserHostId;
そして、5秒ごとにマージされた機能3と4について、ユーザー1と2からの拒否を表示するには、次のようにすればよいでしょう。
SET @DenialMergingTime := 5;
SELECT GroupTime, FeatureId, UserHostId, MultiplicitySum FROM MergedDenials WHERE UserHostId IN (1, 2) AND FeatureId IN (3, 4);
ビューを使うのは、データをフィルタリングしたり、jQueryのグリッドで明示的に使用したり、自動的に順序を変えたり、レコード数を制限したりすることが簡単だからです。
しかし、それはただの醜い回避策です。これを行うための適切な方法はありますか?
どのように解決するのですか?
実は、Func:
create function p1() returns INTEGER DETERMINISTIC NO SQL return @p1;
と表示します。
create view h_parm as
select * from sw_hardware_big where unit_id = p1() ;
次に、パラメータを指定してビューを呼び出すことができます。
select s.* from (select @p1:=12 p) parm , h_parm s;
お役に立てれば幸いです。
関連
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] MySQLのAUTO_INCREMENTをリセットする方法
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] MySQLでコマンドラインを使用してユーザーアカウントのリストを取得するにはどうすればよいですか?
-
[解決済み] MySQLのクエリ結果をCSV形式で出力するにはどうすればよいですか?
-
[解決済み] setTimeout()コールバックにパラメータを渡すにはどうすればよいですか?
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLのLike演算子に関する詳細
-
MySQL サービスとデータベース管理
-
MySQL インタビューの質問 - ハッシュインデックスを設定する方法
-
[解決済み] datetimeの挿入時に文字列から日付や時刻を変換すると、変換に失敗する
-
[解決済み] 親の行を削除または更新できない:外部キー制約が失敗する
-
SQLException。オペランドは1列でなければなりません。
-
MySQLでテーブルを削除します。親行が削除または更新できません: 外部キー制約に失敗しました。
-
msql クエリでのエラー 'where 節' の不明な列 'yellow fruit'
-
[解決済み] mysqladminのフラッシュホストでブロックを解除する方法
-
[解決済み] MySQLデータベースの名前を素早く変更する(スキーマ名を変更する)方法は?