私はこのような見解を持っています:
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;
多重度とは、同じ秒に記録される同一のリクエストの数です。拒否のリストを表示したいのですが、アプリケーションが拒否されたときに、念のため数回再試行します。そのため、通常、同じユーザーが数秒間に同じ機能を3回拒否すると、実際には1回拒否されます。この要求を満たすためにもう1つのリソースがある場合、次の2つの拒否は行われません。したがって、レポート内の拒否をグループ化して、ユーザーが拒否をグループ化する期間を指定できるようにします。たとえば、タイムスタンプに(機能1のユーザー1の)拒否があり、ユーザーが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グリッドで明示的に使用したり、自動的に順序付けしたり、レコード数を制限したりするのが簡単なので、ビューを使用します。
しかし、これは醜い回避策です。これを行う適切な方法はありますか?