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.