sql >> Database >  >> RDS >> Mysql

Een opgeslagen procedure uitvoeren met cursor in PHP

Gebaseerd op discussies in de chat voor 3 groepen, en dit leverde SQLFiddle op voor testgegevens (niet veel gegevens daar).

Vanwege het testen van gegevens met een schuifvenster van waar now() is in relatie tot die gegevens, werd de volgende variabele gebruikt om now() te "bevriezen" . Simpelweg om het testen en verifiëren van de output te vergemakkelijken.

Dus gooi dat uiteindelijk weg en verander de 4 verwijzingen in de code die het gebruiken (merk op dat Groep 3 het twee keer gebruikt).

De now() variabele:

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

De zoekopdracht:

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;

Uitvoer (mijn clienttool heeft momenteel tekstproblemen):

Zie mijn algemene opmerkingen bovenaan dit antwoord van mij voor geavanceerd gebruik van variabelen.




  1. Hoe de Unix-tijdstempel in Oracle te retourneren

  2. Hoe de dichtstbijzijnde locatie te vinden met behulp van de lengte- en breedtegraad uit de SQL-database?

  3. Door gebruikers geüploade afbeeldingen efficiënt opslaan in het bestandssysteem

  4. Hoe te tellen op een vakbondsquery