Bunun gibi bir görüşüm var:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = 2;
Daha genel hale getirmek istiyorum, bu 2'yi bir değişkene dönüştürmek anlamına geliyor. Bunu denedim:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = @MyVariable;
Ancak MySQL buna izin vermiyor.
Çirkin bir çözüm buldum:
CREATE FUNCTION GetMyVariable() RETURNS INTEGER DETERMINISTIC NO SQL
BEGIN RETURN @MyVariable; END|
Ve sonra görüş:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = GetMyVariable();
Ama gerçekten berbat görünüyor ve kullanımı da berbat - görünümün her kullanımından önce @MyVariable'ı ayarlamam gerekiyor.
Bunun gibi kullanabileceğim bir çözüm var mı:
SELECT Column FROM MyView(2) WHERE (...)
Somut durum şu şekildedir: Reddedilen taleple ilgili bilgileri depolayan bir tablom var:
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;
Çokluk, aynı saniyede kaydedilen aynı taleplerin sayısıdır. Reddetmelerin bir listesini görüntülemek istiyorum, ancak bazen uygulama reddedildiğinde emin olmak için birkaç kez yeniden deniyor. Bu nedenle, genellikle, aynı kullanıcı birkaç saniye içinde aynı özelliği 3 kez reddettiğinde, bu aslında bir inkar olur. Bu isteği yerine getirmek için bir tane daha kaynağımız olsaydı, sonraki iki ret olmazdı. Bu nedenle, rapordaki redleri gruplayarak kullanıcının redlerin gruplanması gereken zaman aralığını belirlemesine izin vermek istiyoruz. Örneğin, zaman damgalarında (1. özellikte 1. kullanıcı için) redler varsa: 1,2,24,26,27,45 ve kullanıcı 4 saniyeden daha yakın olan redleri gruplamak istiyorsa, şuna benzer bir şey almalıdır: 1 (x2), 24 (x3), 45 (x1). Gerçek inkarlar arasındaki boşlukların, kopyalar arasındaki boşluktan çok daha büyük olduğunu varsayabiliriz.
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;
Ardından, 3. ve 4. özelliklerde kullanıcı 1 ve 2'den gelen redleri her 5 saniyede bir birleştirerek göstermek için yapmanız gereken tek şey:
SET @DenialMergingTime := 5;
SELECT GroupTime, FeatureId, UserHostId, MultiplicitySum FROM MergedDenials WHERE UserHostId IN (1, 2) AND FeatureId IN (3, 4);
Görünümü kullanıyorum çünkü içinde veriyi filtrelemek ve onu jQuery ızgarasında açıkça kullanmak, otomatik olarak sıralamak, kayıt sayısını sınırlamak vb.
Ancak bu sadece çirkin bir çözüm. Bunu yapmanın uygun bir yolu var mı?