sql >> Databasteknik >  >> RDS >> Mysql

Exekvera en lagrad procedur med markören i PHP

Baserat på diskussioner i chatt för 3 grupperingar, och detta gav SQLFiddle för testdata (inte mycket data där).

På grund av att testa data med ett glidande fönster där now() är i relation till dessa data, användes följande variabel för att "frysa" now() . Helt enkelt för att underlätta testning och verifiering av utdata.

Så, sluta med det och ändra de fyra referenserna i koden som använder det (observera att grupp 3 använder det två gånger).

now() variabel:

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';

Frågan:

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;

Utdata (mitt klientverktyg är textutmanat för tillfället):

Se mina allmänna kommentarer överst i detta mitt svar för avancerad variabel användning.




  1. Hur ändrar man tabellstrukturen i Oracle?

  2. MySQL Välj alla kolumner från en tabell och några från en annan tabell

  3. Konvertera SQLITE SQL dumpfil till POSTGRESQL

  4. Ska jag använda MySQL blob-fälttyp?