Basierend auf Diskussionen im Chat für 3 Gruppierungen, und dies lieferte SQLFiddle für Testdaten (nicht viele Daten dort).
Aufgrund von Testdaten mit einem gleitenden Fenster von where now()
in Beziehung zu diesen Daten steht, wurde die folgende Variable verwendet, um now()
"einzufrieren". . Einfach um das Testen und Verifizieren der Ausgabe zu erleichtern.
Lassen Sie das also endgültig fallen und ändern Sie die 4 Referenzen im Code, die es verwenden (beachten Sie, dass Gruppe 3 es zweimal verwendet).
Der now()
Variable:
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';
Die Abfrage:
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;
Ausgabe (mein Client-Tool ist im Moment Text-Challenge):
Siehe meine allgemeinen Kommentare oben in diesem Antwort von mir für fortgeschrittene Verwendung von Variablen.