Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menjalankan prosedur tersimpan dengan kursor di PHP

Berdasarkan diskusi dalam obrolan untuk 3 pengelompokan, dan ini menyediakan SQLFiddle untuk data uji (tidak banyak data di sana).

Karena menguji data dengan jendela geser di mana now() dalam kaitannya dengan data itu, variabel berikut digunakan untuk "membekukan" now() . Hanya untuk memfasilitasi pengujian dan verifikasi keluaran.

Jadi, abaikan itu dan ubah 4 referensi dalam kode yang menggunakannya (perhatikan bahwa Grup 3 menggunakannya dua kali).

now() variabel:

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

Permintaan:

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;

Output (alat klien saya saat ini sedang ditantang teks):

Lihat komentar umum saya di bagian atas ini jawaban saya untuk penggunaan variabel tingkat lanjut.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolom terenkripsi MySQL

  2. UPDATE beberapa tabel di MySQL menggunakan LEFT JOIN

  3. Bagaimana cara menentukan batasan unik untuk banyak kolom di MySQL?

  4. Skrip untuk mengubah semua tabel dan bidang ke susunan utf-8-bin di MYSQL

  5. struktur tabel mysql dengan banyak variabel