SORU
17 ŞUBAT 2010, ÇARŞAMBA


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
16 Mart 2011, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jana Williams

    Jana William

    17 AĞUSTOS 2011
  • midomansour

    midomansour

    19 EYLÜL 2009
  • MrMimoB

    MrMimoB

    11 NİSAN 2011