Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wykonywanie procedury składowanej z kursorem w PHP

Na podstawie dyskusji na czacie dla 3 grup, które dostarczyły SQLFiddle dla danych testowych (mało tam danych).

Ze względu na testowanie danych z przesuwanym oknem, gdzie now() jest w związku z tymi danymi, następująca zmienna została użyta do "zamrożenia" now() . Po prostu w celu ułatwienia testowania i weryfikacji wyników.

Więc wyrzuć to ostatecznie i zmień 4 odniesienia w kodzie, które go używają (zauważ, że Grupa 3 używa go dwukrotnie).

now() zmienna:

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

Zapytanie:

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;

Dane wyjściowe (moje narzędzie klienta jest obecnie kwestionowane w postaci tekstu):

Zobacz moje ogólne komentarze na górze tego moja odpowiedź na zaawansowane wykorzystanie zmiennych.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zwrócić identyfikatory na insertach z mybatis w mysql z adnotacjami

  2. Darmowy hosting z obsługą PHP

  3. Implementacja MySQL w SQL Server 2005 ZAMIENIĆ NA?

  4. Co to jest LENGTH() w MySQL?

  5. Najlepszy i optymalny sposób na połączenie maksymalnej wartości z innej tabeli