Hãy thử sử dụng các biến phiên hoặc trừu tượng hóa nó thành một thủ tục được lưu trữ, chẳng hạn như -
Đầu tiên:
SELECT
@calldate:=`calldate`,
@peakchan:=MAX(concurrent)+1
FROM (
...
) AS baseview
GROUP BY calldate
Thứ hai:
SELECT @longestcall:=MAX(duration) FROM bridgedb.log WHERE `start` >= NOW() - INTERVAL 1 DAY
Thứ ba:
SELECT @totalmins:=SUM(duration) FROM bridgedb.log WHERE `start` >= NOW() - INTERVAL 1 DAY
Thứ tư:
SELECT @totalconfs:=COUNT(*) FROM bridgedb.log WHERE `start` >= NOW() - INTERVAL 1 DAY;
Và cuối cùng
INSERT INTO bridgedb.stats (date, peakchan, longestcall, totalmins, totalconfs)
VALUES (@calldate, @peakchan, @longestcall, @totalmins, @totalconfs)
BTW:Không phải là ý kiến hay khi gọi một cột date
.
CHỈNH SỬA
Tất nhiên bạn cần đảm bảo rằng, các truy vấn đó chạy trong cùng một phiên để sử dụng các biến phiên. Đây là mặc định khi chạy với một kết nối DB duy nhất trong PHP
CHỈNH SỬA 2
Để xử lý các khoảng thời gian không có hoạt động, bạn có thể
- thêm tiền tố này bằng
SELECT @calldate:=DATE(NOW() - INTERVAL 1 DAY), @peakchan:=0, @longestcall:=0, @totalmins:=0, @totalconfs:=0;
(ghi với các giá trị mặc định được tạo) - hoặc dừng sau truy vấn đầu tiên, nếu @calldate là NULL (không có bản ghi nào được tạo)
CHỈNH SỬA 3
Điều này phù hợp với tôi:
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 ;
tiếp theo là
CALL ReportYesterday();