sql >> データベース >  >> RDS >> Mysql

PHPでカーソルを使用してストアドプロシージャを実行する

    3つのグループのチャットでの議論に基づいており、これによりSQLFiddle が提供されました。 テストデータ用(データはそれほど多くありません)。

    now()のスライディングウィンドウでデータをテストしたため はそのデータに関連しており、次の変数を使用してnow()を「フリーズ」しました。 。単に出力のテストと検証を容易にするためです。

    したがって、それを最終的に破棄し、それを使用するコード内の4つの参照を変更します(グループ3はそれを2回使用することに注意してください)。

    now() 変数:

    select @theNow:=now();
    -- REM OUT the following line. It is used only for testing (as now will chg, your data won't)
    select @theNow:='2016-06-23 14:00:00';
    

    クエリ:

    select id,sentNum,message,sentTime,startAtTime,sentByTime,msgType,theGrp from
    (   select id,sentNum,message,sentTime,startAtTime,sentByTime,msgType,theGrp,
        if([email protected],greatest(@sentNumChg:=1,0),least(@sentNumChg:=0,1)) as dummy1,
        if([email protected],greatest(@grpChg:=1,0),least(@grpChg:=0,1)) as dummy2,
        if(@sentNumChg=1 or @grpChg=1,@seqNum:=1,@seqNum:[email protected]+1) as seqNum,
        @lastSentNum:=sentNum as setLast01,
        @lastGrp:=theGrp as setLast02
        from
        (   -- GROUP 1: sentByTime<=now(), INVITE
            select `id`, `sentNum`, `message`, `sentTime`, `startAtTime`, `sentByTime`, `msgType`, 1 as theGrp
            from SmsQueue
            where sentByTime<[email protected] and msgType='invite'
            UNION ALL
            -- GROUP 2 startAtTime<=now(), BROADCAST
            select `id`, `sentNum`, `message`, `sentTime`, `startAtTime`, `sentByTime`, `msgType`, 2 as theGrp
            from SmsQueue
            where startAtTime<[email protected] and msgType='broadcast'
            UNION ALL
            -- GROUP 3: sentByTime>now() && startAtTime<=now(), INVITE
            select `id`, `sentNum`, `message`, `sentTime`, `startAtTime`, `sentByTime`, `msgType`, 3 as theGrp
            from SmsQueue
            where sentByTime>@theNow and startAtTime<[email protected] and msgType='invite'
        ) d1
        cross join (select @sentNumChg:=0,@grpChg:=0,@lastSentNum:='',@lastGrp:=0,@seqNum:=0) as xParams
        order by sentNum,theGrp,sentByTime,id -- id is the tie-break
    ) d2
    where (theGrp=1 and seqNum<3) or (theGrp=2 and seqNum=1) or (theGrp=3 and seqNum=1)
    order by sentNum,theGrp;
    

    出力(現在、私のクライアントツールはテキストチャレンジされています):

    これ の上部にある私の一般的なコメントを参照してください 高度な変数の使用法に対する私の答え。




    1. PHPのログインページでのSQLインジェクションの防止

    2. SQL Serverでマテリアライズドビューを作成するにはどうすればよいですか?

    3. DBにバイナリとして格納されているJavaUUIDを取得する方法

    4. postgresでISO-8601グレゴリオ暦の日付テーブルを作成する方法