programing

MySQL에서 파라미터를 사용하여 뷰를 작성할 수 있습니까?

randomtip 2022. 12. 31. 16:45
반응형

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,2,24,26,27,45에 거부(피처1의 사용자 1)가 있고 사용자가 4초보다 가까운 거부(denials)를 그룹화하려면 다음과 같이 해야 합니다: 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;

다음으로 5초마다 Marge된 기능3 및 기능4에 대한 사용자1 및 2로부터의 거부를 표시하려면 다음 절차만 수행합니다.

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

보기에서는 데이터를 필터링하고 jQuery 그리드에서 명시적으로 사용하거나 자동으로 순서를 지정하거나 레코드 수를 제한하기 때문에 보기를 사용합니다.

하지만 이건 그저 추악한 회피책일 뿐이야.이 일을 제대로 하는 방법이 있을까요?

실제로 func를 작성하는 경우:

create function p1() returns INTEGER DETERMINISTIC NO SQL return @p1;

및 표시:

create view h_parm as
select * from sw_hardware_big where unit_id = p1() ;

그런 다음 매개 변수를 사용하여 보기를 호출할 수 있습니다.

select s.* from (select @p1:=12 p) parm , h_parm s;

도움이 됐으면 좋겠어요.

CREATE VIEW MyView AS
   SELECT Column, Value FROM Table;


SELECT Column FROM MyView WHERE Value = 1;

MySQL의 적절한 솔루션이라면 다른 SQL을 사용하면 보기를 보다 정확하게 정의할 수 있습니다.

주의: 뷰가 매우 복잡하지 않은 한 MySQL은 이 기능을 적절하게 최적화합니다.

이전에 스토어드 프로시저를 사용하지 않고 파라미터 테이블과 connection_id() 매직을 사용하는 다른 회피책을 생각해 냈습니다.

EDIT(댓글에서 복사)

connection_id(거짓말하지 마세요.뷰에 대한 매개변수에 대한 열을 해당 테이블에 배치합니다.를 누르세요.connection_id를합니다.CONNECTION_ID()value.connection_id 를 합니다.하고, 「」를 붙입니다.WHERE param_table.connection_id = CONNECTION_ID()이 경우 파라미터 테이블에서 원하는 행이1개만 교차 결합됩니다.할 수 있습니다.를 들어, 여기서 런음음른음른른른른른른 you you 른른른른른른른 you you you you you you you you you you you you you you you you you 。예를 들어 다음과 같습니다.orders.order_id = param_table.order_id.

언급URL : https://stackoverflow.com/questions/2281890/can-i-create-view-with-parameter-in-mysql

반응형