sql >> データベース >  >> RDS >> Mysql

1つの挿入に対する複数のMySQLクエリ

    セッション変数を使用するか、ストアドプロシージャに抽象化してみてください。たとえば、-

    最初:

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

    2番目:

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

    3番目:

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

    4番目:

    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)
    

    ところで:列を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. MYSql config bind-addressは0.0.0.0に設定されていますが、netstatはUbuntuでは異なって表示されます

    2. SQLServerのテーブル値関数を介してデータを挿入する

    3. LaravelCrypt-値の比較

    4. テーブルの各列の空でない値をカウントする