Я могу создать представление с параметром в 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;

Кратность является многими идентичными запросами, зарегистрированными в ту же секунду. Я хочу отобразить список отказов, но иногда, когда ходатайство отклонено, оно повторяет пару раз только для проверки. Так обычно, когда тот же пользователь получает отказ 3 раза на той же функции в паре секунд, это - на самом деле один отказ. Если бы у нас был бы еще один ресурс, для обрабатывания этого запроса, следующих двух отказов не произошло бы. Таким образом, мы хотим сгруппировать отказы в отчете, разрешающем пользователю указывать промежуток, в котором должны быть сгруппированы отказы. Например, если у нас есть отказы (для пользователя 1 на функции 1) в метках времени: 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;

Затем для показа отказов от пользователя 1 и 2 на функциях 3 и 4 объединяемых каждые 5 секунд все, что необходимо сделать:

SET @DenialMergingTime := 5;
SELECT GroupTime, FeatureId, UserHostId, MultiplicitySum FROM MergedDenials WHERE UserHostId IN (1, 2) AND FeatureId IN (3, 4);

Я использую представление, потому что в нем легко отфильтровать данные и использовать его явно в сетке jQuery, автоматически закажите, ограничьте количество записей и так далее.

Но это - просто ужасное обходное решение. Существует ли надлежащий способ сделать это?

85
задан Bilaal Rashid 19 February 2019 в 21:25
поделиться

1 ответ

CREATE VIEW MyView AS
   SELECT Column, Value FROM Table;


SELECT Column FROM MyView WHERE Value = 1;

Это подходящее решение для MySQL, некоторые другие SQL позволяют более точно определять представления.

Примечание: если представление не очень сложное, MySQL прекрасно его оптимизирует.

20
ответ дан 24 November 2019 в 08:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: