que tienen una vista como esta:¿Puedo crear vistas con el parámetro en MySQL?
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = 2;
me gustaría hacerlo más genérico, que significa cambiar 2 en una variable. Intenté esto:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = @MyVariable;
Pero mysql no permite esto.
me encontré con un feo solución:
CREATE FUNCTION GetMyVariable() RETURNS INTEGER DETERMINISTIC NO SQL
BEGIN RETURN @MyVariable; END|
Y entonces vista es:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = GetMyVariable();
Pero parece realmente horrible, y el uso también es horrible - Tengo que fijar la @MyVariable antes cada uso de la vista.
¿Hay una solución, que podría utilizar la siguiente manera:
SELECT Column FROM MyView(2) WHERE (...)
La situación concreta es la siguiente: Tengo una tabla que almacena información acerca de la solicitud denegada:
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;
multiplicidad es número de solicitudes idénticas registradas en el mismo segundo. Quiero mostrar una lista de denegaciones, pero a veces, cuando se deniega la aplicación, se reintenta un par de veces para asegurarse. Por lo general, cuando el mismo usuario obtiene la negación 3 veces en la misma función en un par de segundos, en realidad es una denegación. Si tuviéramos un recurso más, para cumplir con esta solicitud, las próximas dos denegaciones no sucederían. Por lo tanto, queremos agrupar las denegaciones en el informe, lo que permite al usuario especificar el intervalo de tiempo en el que se deben agrupar las denegaciones. P.ej. si tenemos denegaciones (para el usuario 1 en la función 1) en las indicaciones de fecha y hora: 1,2,24,26,27,45 y el usuario desea agrupar las denegaciones que están más cercanas entre sí que 4 segundos, debería obtener algo como esto: 1 (x2), 24 (x3), 45 (x1). Podemos suponer que los espacios entre las negaciones reales son mucho mayores que entre las duplicaciones. He resuelto el problema en la siguiente forma:
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;
continuación para mostrar las negativas de usuario 1 y 2 en funciones 3 y 4 refundidos cada 5 segundos todo lo que tiene que hacer es:
SET @DenialMergingTime := 5;
SELECT GroupTime, FeatureId, UserHostId, MultiplicitySum FROM MergedDenials WHERE UserHostId IN (1, 2) AND FeatureId IN (3, 4);
utilizo vista , porque en él es fácil filtrar los datos y usarlos explícitamente en la grilla jQuery, ordenar automáticamente, limitar el número de registros, etc.
Pero es solo una solución fea. ¿Hay una forma adecuada de hacer esto?
Wow, esta es una de las cosas más hacky que he visto en SQL;) Pero es exactamente lo que quería hacer. – ssobczak
¿No debería ser NO DETERMINISTA? – MosheElisha
@MichaelMior Los documentos de MySQL dicen: "Una rutina se considera" determinista "si siempre produce el mismo resultado para los mismos parámetros de entrada, y" no determinista ". Si no se proporciona DETERMINISTIC ni NOT DETERMINISTIC en la definición de rutina, el el valor predeterminado NO ES DETERMINISTA. Para declarar que una función es determinista, debe especificar DETERMINISTIC explícitamente ". - según tengo entendido, no es solo durante la ejecución de la vista. – MosheElisha