Dựa trên các cuộc thảo luận trong trò chuyện cho 3 nhóm và điều này đã cung cấp SQLFiddle cho dữ liệu thử nghiệm (không có nhiều dữ liệu ở đó).
Do kiểm tra dữ liệu với cửa sổ trượt tại nơi now()
liên quan đến dữ liệu đó, biến sau được sử dụng để "đóng băng" now()
. Chỉ đơn giản là để tạo điều kiện thuận lợi cho việc kiểm tra và xác minh đầu ra.
Vì vậy, hãy loại bỏ điều đó cuối cùng và thay đổi 4 tham chiếu trong mã sử dụng nó (lưu ý rằng Nhóm 3 sử dụng nó hai lần).
now()
biến:
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';
Truy vấn:
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;
Đầu ra (công cụ khách hàng của tôi hiện đang bị thách thức):
Xem các nhận xét chung của tôi ở đầu điều này câu trả lời của tôi để sử dụng biến nâng cao.