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

nhiều truy vấn MySQL vào một chèn duy nhất

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();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi laravel classloader.php không thể mở luồng:Không có tệp hoặc thư mục nào như vậy

  2. Cách xác thực một hộp kiểm duy nhất bằng PHP &MySQL

  3. Viết lại URL bằng .htaccess tạo các mục nhập mysql trùng lặp

  4. Mô hình cơ sở dữ liệu cho danh sách nhân viên 24/7 tại sòng bạc

  5. SQLSTATE [23000]:Xử lý lỗi vi phạm ràng buộc toàn vẹn