0

こんにちは、mysql で、さまざまな種類のテーブルを返すストアド プロシージャを作成したいと思いますが、毎回 1 行のみです。複数の結果セットを再取得できる機能を使用する可能性はありません。しかし、次のようなものを使用できればいいでしょう。

main:BEGIN
    IF EXISTS(SELECT 1 
                FROM Ban
               WHERE (`Ban`.`Name` = _IP OR `Ban`.`IP` = _IP)
                 AND `Ban`.`Date` > _Date LIMIT 1)
    THEN BEGIN
        SELECT 0 AS LoginType, `Ban`.`RegID`, `Ban`.`Name`, `Ban`.`Reason`,
               `Ban`.`Date`, `Eredmeny`.`Name`, `Ban`.`UnbanDate`, `Ban`.`BanType` 
          FROM `Ban` 
          LEFT OUTER JOIN (SELECT DISTINCT RegID, Name 
                             FROM ((SELECT Players.RegID,Players.Name FROM Players)
                                    UNION ALL
                                   (SELECT PlayersArchive.RegID, PlayersArchive.Name
                                     FROM PlayersArchive)) Eredmeny) AS Eredmeny
                       ON Ban.RegID = Eredmeny.RegID
         WHERE (`Ban`.`Name` = _Name OR `Ban`.`IP` = _IP)
           AND `Ban`.`Date` > _Date LIMIT 1;
        LEAVE main;
        END;
    END IF;

    IF EXISTS(SELECT 1 FROM `Players` WHERE `Name` = _Name LIMIT 1)
    THEN BEGIN
        SELECT 1 AS LoginType,Players.*
          FROM `Players` WHERE `Name` = _Name LIMIT 1;
        LEAVE main;
    END;
    END IF;

    IF EXISTS(SELECT 1 FROM `PlayersArchive` WHERE `Name` = _Name LIMIT 1)
    THEN BEGIN
        SELECT 2 AS LoginType,PlayersArchive.*
          FROM `PlayersArchive`
         WHERE `Name` = _Name LIMIT 1;
        LEAVE main;
    END;
    END IF;  

    IF EXISTS(SELECT 1 FROM `PreReg` WHERE `Name` = _Name LIMIT 1)
    THEN BEGIN
        SELECT 3 AS LoginType,`Name`, `Password`, `Email`, `RegDate`, `Level`,
               `StuntDone`, `DriftDone`, `ParkourDone`, `RolePlayDone`,
               `DeathmatchDone`, `PosX`, `PosY`, `PosZ`, `PosA`
          FROM `PreReg`
         WHERE `Name` = _Name LIMIT 1;
        LEAVE main;
    END;
    END IF;

    SELECT 4 AS LoginType LIMIT 1;
END

別のアイデアは、関数を作成し、関数内で if ブロックに 4 つのテーブルを作成してテーブルを埋め、テーブルを返すことですが、それが機能するかどうか、または可能かどうかはよくわかりません。しかし、それが次の問題である場合、新しい列がある場合はすべての新しい列を追加したくないので、自動化できないと思います。

_Name is a VARCHAR(24)
_IP is VARCHAR(16)
_Date is INT(11)
4

0 に答える 0