MySQL parametresi ile görünüm oluşturabilir miyim?
Böyle bir manzara var:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = 2;
Bir değişken içine 2 değiştirmek demek daha genel, yapmak istiyorum. Bunu denedim:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = @MyVariable;
Ama mysql bu izin vermez.
Çirkin bir çözüm buldum:
CREATE FUNCTION GetMyVariable() RETURNS INTEGER DETERMINISTIC NO SQL
BEGIN RETURN @MyVariable; END|
And then view is:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = GetMyVariable();
Ama gerçekten berbat görünüyor ve kullanımı da berbat olduğu görüşünün her kullanımdan önce @MyVariable belirlemek zorundayım.
Bu şekilde kullanabileceğim bir çözüm:
SELECT Column FROM MyView(2) WHERE (...)
Somut durumu aşağıdaki gibidir: Bir masa talep reddedildi hakkında bilgi saklamak zorundayım:
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ı istekleri aynı saniye kaydedildi. İnkar listesini görüntülemek istiyorum, ama başvuru reddedildi geldiğinde bazen, birkaç kez sadece emin olmak için yeniden dener. Aynı kullanıcı birkaç saniye içinde aynı özelliğini inkar 3 kez geldiğinde bu yüzden genellikle, aslında bir inkar. Eğer daha fazla kaynak, bu isteği yerine getirmek zorunda olsaydık, önümüzdeki iki inkar öyle bir şey olmaz. Hangi rapor kullanıcı zaman aralığı belirtmek için izin inkar grup olmak istiyoruz bu yüzden inkar gruplandırılmış olmalıdır. E. g. eğer biz inkar (kullanıcı 1 özelliği 1) Zaman Damgası: 1,2,24,26,27,45 ve kullanıcı istediği grup inkar vardır birbirine yaklaştır daha 4 saniye gerekir almak gibi bir şey bu: 1 (x2), 24 (x3), 45 (x1). Gerçek inkar arasında boşluk taklitten arasında çok daha büyük olduğunu tahmin edebiliriz. Aşağıdaki şekilde sorunu çözdüm:
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;
Sonra kullanıcı 1'den inkar Haritayı ve özellikleri 3 ve 4 numaralı 2 için tüm yapmanız gereken, her 5 saniyede bir birleştirilmiş:
SET @DenialMergingTime := 5;
SELECT GroupTime, FeatureId, UserHostId, MultiplicitySum FROM MergedDenials WHERE UserHostId IN (1, 2) AND FeatureId IN (3, 4);
Kolay veri süzmek ve kayıt jQuery ızgara, otomatik sipariş, limitli sayıda açık ve çünkü kullanmak için görüntülemek kullanın.
Ama bu sadece kötü bir çözüm. Düzgün bunu yapmak için bir yol var mı?
CEVAP
Eğer işlev oluşturursanız aslında:
create function p1() returns INTEGER DETERMINISTIC NO SQL return @p1;
ve görünümü:
create view h_parm as
select * from sw_hardware_big where unit_id = p1() ;
Sonra bir parametre ile bir görünüm diyebilirsiniz:
select s.* from (select @p1:=12 p) parm , h_parm s;
Yardımcı olur umarım.
Nasıl bağımlılıkları Maven kullanarak ...
Nasıl sadece bir kullanıcının git bir ...
Bir alana birden çok MySQL satırları B...
Nasıl bir onaltılık dize gelen bir UİC...
Nasıl belirli bir tablo için MySQL mot...