सत्र चर का उपयोग करने का प्रयास करें या इसे एक संग्रहीत कार्यविधि में अमूर्त करें, जैसे -
पहला:
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();