mysql - 相同的存储过程,相同的表,不同的数据库给出不同的结果

标签 mysql sql

我有一个存储过程,当我在 MySQL 5 上运行它时,它会给出预期的结果。但是当我尝试在 MariaDB 10.1.22 上运行相同的过程时,它给出了不同的结果。

这是我的存储过程 -

    DELIMITER ;;
    CREATE DEFINER=`mconnect_admin`@`%` PROCEDURE `TestCumulative`(IN 
    start_date TIMESTAMP,IN end_date TIMESTAMP,IN duration TEXT,IN 
    mno_id TEXT,IN profile_type TEXT,IN timezone TEXT)

    BEGIN
    SET @provisioned = 0;
    SET @downloaded = 0;

    SET @excludeProfileFilter = FALSE;
    SET @hourlyReport = FALSE;
    SET @monthlyReport = FALSE;
    SET @sdate = start_date;

    DROP TABLE IF EXISTS tempDates;
    CREATE TEMPORARY TABLE IF NOT EXISTS tempDates(timeRange 
    VARCHAR(50));
    DELETE FROM tempDates;

    IF(profile_type = '')
       THEN
       SET profile_type = null;
       SET @excludeProfileFilter = TRUE;
    END IF;

    IF (duration = 'lastDay')
      THEN
      SET @hourlyReport=true;
    END IF;

    IF (duration = 'lastYear')
      THEN
      SET @monthlyReport = TRUE;
    END IF;

    WHILE @sdate <= end_date DO
       IF (@hourlyReport = TRUE)
         THEN
         INSERT INTO tempDates (timeRange) VALUES (HOUR(@sdate) + 1);
         SET @sdate = date_add(@sdate, INTERVAL 1 HOUR); 
       ELSE IF(@monthlyReport = TRUE)
         THEN
         INSERT INTO tempDates (timeRange) VALUES (MONTH(@sdate));
         SET @sdate = date_add(@sdate, INTERVAL 1 MONTH);
       ELSE
         INSERT INTO tempDates (timeRange) VALUES (DATE(@sdate));
         SET @sdate = date_add(@sdate, INTERVAL 1 DAY);
       END IF;
       END IF;
   END WHILE ;

   SELECT  CASE WHEN r.DateRange IS NULL THEN (@provisioned := 
   @provisioned) ELSE (@provisioned := @provisioned + r.Provisioned) 
   END AS Provisioned,
   CASE WHEN r.DateRange IS NULL THEN (@downloaded := @downloaded) ELSE 
   (@downloaded := @downloaded + r.Downloaded) END AS Downloaded, 
   CASE WHEN r.DateRange IS NULL THEN d.timeRange ELSE r.DateRange END 
   AS DateRange FROM (
   SELECT sum(result.Provisioned) as Provisioned, 
   sum(result.Downloaded) AS Downloaded, result.DateRange FROM (

   SELECT 
   1 As Provisioned, 
   0 AS Downloaded,
   CASE WHEN @hourlyReport=TRUE 
        THEN HOUR(CONVERT_TZ(s.provisioning_date,"+00:00",timezone)) 
        WHEN @monthlyReport=TRUE
        THEN MONTH(CONVERT_TZ(s.provisioning_date,"+00:00",timezone)) 
        ELSE DATE(CONVERT_TZ(s.provisioning_date,"+00:00",timezone))
    END     
    AS DateRange 

   FROM subscription s 
   INNER JOIN profile_type p ON p.id = s.profile_type 
   WHERE s.mno_id = mno_id
   AND (@excludeProfileFilter=true or p.display_name=profile_type OR p.subscription_type=profile_type)
   AND DATE(CONVERT_TZ(s.provisioning_date,"+00:00",timezone)) BETWEEN DATE(CONVERT_TZ(start_date,"+00:00",timezone)) AND DATE(CONVERT_TZ(end_date,"+00:00",timezone))

UNION ALL

SELECT 
    0 As Provisioned, 
    1 As Downloaded,

    CASE WHEN @hourlyReport=TRUE 
        THEN COALESCE(HOUR(CONVERT_TZ(r.end_download_date,"+00:00",timezone)),HOUR(CONVERT_TZ(r.last_update,"+00:00",timezone))) 
        WHEN @monthlyReport=TRUE
        THEN COALESCE(MONTH(CONVERT_TZ(r.end_download_date,"+00:00",timezone)),MONTH(CONVERT_TZ(r.last_update,"+00:00",timezone)))
        ELSE COALESCE(DATE(CONVERT_TZ(r.end_download_date,"+00:00",timezone)),DATE(CONVERT_TZ(r.last_update,"+00:00",timezone)))
    END
    AS DateRange 

   FROM subscription s 
   INNER JOIN profile_type p ON p.id = s.profile_type 
   LEFT JOIN rsp_session r ON r.profile_iccid = s.iccid 
   WHERE s.mno_id = mno_id
   AND (@excludeProfileFilter=TRUE OR p.display_name=profile_type OR p.subscription_type=profile_type)
   AND COALESCE(DATE(CONVERT_TZ(r.end_download_date,"+00:00",timezone)),DATE(CONVERT_TZ(r.last_update,"+00:00",timezone))) BETWEEN DATE(CONVERT_TZ(start_date,"+00:00",timezone)) AND DATE(CONVERT_TZ(end_date,"+00:00",timezone)) AND s.status IN('INSTALLED','ENABLED','DELETED')

) result GROUP BY result.DateRange
) r RIGHT OUTER JOIN tempDates d ON r.DateRange = d.timeRange;

   END;;
   DELIMITER ;

我在 MaroiaDB 10.1.22 中得到的结果是不正确的 -

2   0   2017-11-02
5   10  2017-11-03
32  16  2017-11-06
51  34  2017-11-07
64  42  2017-11-08
79  47  2017-11-09
79  48  2017-11-10
102 61  2017-11-13
116 61  2017-11-14
128 68  2017-11-15
145 71  2017-11-16
157 82  2017-11-17
196 95  2017-11-20
254 111 2017-11-21
273 118 2017-11-22
313 134 2017-11-23
323 144 2017-11-24
363 149 2017-11-27
368 152 2017-11-28
371 152 2017-11-29
403 160 2017-11-30
403 160 2017-11-01
403 160 2017-11-04
403 160 2017-11-05
403 160 2017-11-11
403 160 2017-11-12
403 160 2017-11-18
403 160 2017-11-19
403 160 2017-11-25
403 160 2017-11-26

应该是有序的。

谁能告诉我出了什么问题吗?或者它的数据库问题?

提前致谢。

最佳答案

您的任何查询中都没有order by。结果集可以采用任何顺序,因为没有 order by 的结果集(如表)是无序集。

因此,数据库是正确的。您的理解忽略了有关 SQL 的这一重要事实。

添加您想要的order by,结果集将在您使用的任何版本的数据库中进行适当的排序。

关于mysql - 相同的存储过程,相同的表,不同的数据库给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48853629/

相关文章:

java - UnableToExecuteStatementException : Batch entry was aborted. 调用getNextException查看原因

php - 这是过滤数据和防止 SQL 注入(inject)和其他攻击的安全方法吗?

mysql - 如何在查询中向 MYSQL 中的日期添加天数

MySQL PDO - 用变量完成请求的最佳方法是什么?

php - 在已经运行的查询循环中从第二个表调用循环查询

mysql - 大型数据库

mysql - 在一张表上操作时需要Inner Join吗?

sql - 子查询 vs MAX 聚合函数性能

mysql - 从 MySQL 查询结果集中检索多个随机行 - 不使用 order by rand()

python - 如何在django模型中选择相关的,所以它不会产生很多子查询