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

एक ही डालने के लिए एकाधिक MySQL क्वेरी

सत्र चर का उपयोग करने का प्रयास करें या इसे एक संग्रहीत कार्यविधि में अमूर्त करें, जैसे -

पहला:

SELECT
  @calldate:=`calldate`,
  @peakchan:=MAX(concurrent)+1
FROM (
  ...
) AS baseview
GROUP BY calldate

दूसरा:

SELECT @longestcall:=MAX(duration) FROM bridgedb.log WHERE `start` >= NOW() - INTERVAL 1 DAY

तीसरा:

SELECT @totalmins:=SUM(duration)  FROM bridgedb.log WHERE `start` >= NOW() - INTERVAL 1 DAY

चौथा:

SELECT @totalconfs:=COUNT(*) FROM bridgedb.log WHERE `start` >= NOW() - INTERVAL 1 DAY;

और अंत में

INSERT INTO bridgedb.stats (date, peakchan, longestcall, totalmins, totalconfs)
VALUES (@calldate, @peakchan, @longestcall, @totalmins, @totalconfs)

BTW:किसी कॉलम को date कॉल करना अच्छा विचार नहीं है ।

संपादित करें

बेशक आपको यह सुनिश्चित करने की ज़रूरत है कि सत्र चर का उपयोग करने के लिए वे प्रश्न उसी सत्र में चलते हैं। PHP में एकल DB कनेक्शन के साथ चलाने पर यह डिफ़ॉल्ट होता है

2 संपादित करें

गतिविधि के बिना अवधियों को संभालने के लिए, आप कर सकते हैं

  • या तो इसके पहले SELECT @calldate:=DATE(NOW() - INTERVAL 1 DAY), @peakchan:=0, @longestcall:=0, @totalmins:=0, @totalconfs:=0; (डिफ़ॉल्ट के साथ रिकॉर्ड बनाया गया)
  • या पहली क्वेरी के बाद रुकें, अगर @calldate NULL है (कोई रिकॉर्ड नहीं बनाया गया)

3 संपादित करें

यह मेरे लिए काम करता है:

DELIMITER //

CREATE PROCEDURE ReportYesterday()
BEGIN
  DECLARE calldate DATE;
  DECLARE peakchan, longestcall, totalmins, totalconfs INT;

SELECT
  @calldate:=`calldate`,
  @peakchan:=MAX(concurrent)+1
FROM (
       SELECT
          DATE(a.calldate) as calldate,
          COUNT(b.uniqueid) AS concurrent
        FROM asteriskcdr.cdr AS a, asteriskcdr.cdr AS b
        WHERE  
          a.calldate >= NOW() - INTERVAL 1 DAY
          AND (
            (a.calldate<=b.calldate AND (UNIX_TIMESTAMP(a.calldate)+a.duration)>=UNIX_TIMESTAMP(b.calldate))
            OR (b.calldate<=a.calldate AND (UNIX_TIMESTAMP(b.calldate)+b.duration)>=UNIX_TIMESTAMP(a.calldate))
          )
          AND a.uniqueid>b.uniqueid
        GROUP BY a.uniqueid) AS baseview
GROUP BY calldate
;

-- EDIT 4 IS THE FOLLOWING LINE 

IF @calldate IS NOT NULL THEN

  SELECT @longestcall:=MAX(duration) FROM bridgedb.log WHERE `start` >= NOW() - INTERVAL 1 DAY
  ;

  SELECT @totalmins:=SUM(duration)  FROM bridgedb.log WHERE `start` >= NOW() - INTERVAL 1 DAY
  ;

  SELECT @totalconfs:=COUNT(*) FROM bridgedb.log WHERE `start` >= NOW() - INTERVAL 1 DAY
  ;

  INSERT INTO bridgedb.stats (date, peakchan, longestcall, totalmins, totalconfs)
  VALUES (@calldate, @peakchan, @longestcall, @totalmins, @totalconfs)
  ;

END IF;

END
;
//

DELIMITER ;

उसके बाद

CALL ReportYesterday();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कैसे Laravel आदेश लिखने के लिए क्वेरी द्वारा?

  2. एक ड्रॉपडाउन सूची से एक PHP से दूसरे में मूल्य पास करना

  3. Django में manage.py के साथ सीएलआई से डेटाबेस को साफ़ करने का सबसे आसान तरीका क्या है?

  4. स्थानीय MySQL डेटाबेस का बैकअप लेने के लिए Windows बैच स्क्रिप्ट और बैकअप फ़ाइलों के साथ केवल N नवीनतम फ़ोल्डर रखें

  5. MySQL सीमा में लापता घंटे/तिथियां कैसे भरें?