Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP में कर्सर के साथ एक संग्रहीत कार्यविधि निष्पादित करना

3 समूहों के लिए चैट में चर्चा के आधार पर, और इसने SQLFiddle प्रदान किया। परीक्षण डेटा के लिए (वहां अधिक डेटा नहीं है)।

जहां 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. अद्यतन या सम्मिलित करें MySQL पायथन

  2. अगर मैं MySQL में int(255) स्टोर करता हूं तो MAX नंबर क्या होगा?

  3. Yii ढांचे में डेटाबेस कनेक्शन को कॉन्फ़िगर करना

  4. क्वेरी के दौरान MySQL सर्वर से कनेक्शन टूट गया

  5. mysql DATETIME कॉलम को युग सेकंड में बदलें