Mysql
 sql >> база данни >  >> RDS >> Mysql

Изпълнение на съхранена процедура с курсор в PHP

Въз основа на дискусии в чата за 3 групи и това предостави SQLPiddle за тестови данни (там няма много данни).

Поради тестване на данни с плъзгащ се прозорец на where now() е във връзка с тези данни, следната променлива беше използвана за "замразяване" now() . Просто за улесняване на тестването и проверката на изхода.

Така че в крайна сметка отхвърлете това и променете 4-те препратки в кода, които го използват (обърнете внимание, че Група 3 го използва два пъти).

now() променлива:

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

Заявката:

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;

Изход (моят клиентски инструмент в момента е оспорен с текст):

Вижте общите ми коментари в горната част на това мой отговор за разширено използване на променлива.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не може да се открие нулева стойност от JSON_EXTRACT

  2. Избягвайте повтарящи се записи, показвани в MySQL / PHP

  3. InnoDB (MySQL 5.5.8) правилният избор ли е за няколко милиарда редове?

  4. Как мога да изхвърля MySQL база данни, без да използвам mysqldump в Python

  5. Еквивалентна клауза за връщане на Mysql