sql >> Database >  >> RDS >> Mysql

meerdere MySQL-query's naar een enkele insert

Probeer sessievariabelen te gebruiken of abstraheer het in een opgeslagen procedure, zoiets als -

Ten eerste:

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

Ten tweede:

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

Ten derde:

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

Ten vierde:

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

En tot slot

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

BTW:Het is geen goed idee om een ​​kolom date . te noemen .

BEWERKEN

Natuurlijk moet je ervoor zorgen dat die query's in dezelfde sessie worden uitgevoerd om sessievariabelen te gebruiken. Dit is de standaard wanneer uitgevoerd met een enkele DB-verbinding in PHP

BEWERK 2

Om periodes zonder activiteit af te handelen, kunt u

  • ofwel prefix dit met SELECT @calldate:=DATE(NOW() - INTERVAL 1 DAY), @peakchan:=0, @longestcall:=0, @totalmins:=0, @totalconfs:=0; (record met gemaakte standaardinstellingen)
  • of stop na de eerste vraag, als @calldate NULL is (geen record aangemaakt)

BEWERK 3

Dit werkt voor mij:

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 ;

gevolgd door

CALL ReportYesterday();


  1. Hoe gebruik ik CREATE OR REPLACE?

  2. Hoe de tekenset en sortering van een database in MySQL in te stellen?

  3. Hoe rang in MySQL te berekenen

  4. Hoe splits ik een begrensde tekenreeks in SQL Server zonder een functie te maken?