Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Thực thi một thủ tục được lưu trữ với con trỏ trong PHP

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL BẤT KỲ &TẤT CẢ các toán tử

  2. Kết quả giới hạn MySQL cho mỗi danh mục

  3. Tên bảng dưới dạng tham số sử dụng câu lệnh chuẩn bị sẵn PDO / MySQL

  4. Cài đặt Innotop để giám sát hiệu suất máy chủ MySQL

  5. MySQL 'Đã cắt ngắn giá trị INTEGER không chính xác'