错误的结果mysql只在函数中

时间:2016-02-16 10:07:24

标签: mysql

我有以下函数,mysql查询:

BEGIN
DECLARE r float(10,2);
DECLARE var_total float(10,2);
DECLARE var_discount float(10,2) DEFAULT null;


SELECT 
    sum(x.amount)
    FROM
(
    (SELECT
        student_booking_school_course_price as amount
     FROM
        tbl_student_booking_school_course
     WHERE
        student_booking_id=par_student_booking_id
     )
    UNION
    (SELECT
        student_booking_school_accommodation_price as amount
     FROM
        tbl_student_booking_school_accommodation
     WHERE
        student_booking_id=par_student_booking_id
     )
    UNION
    (SELECT
        student_booking_school_insurance_price as amount
     FROM
        tbl_student_booking_school_insurance
     WHERE
        student_booking_id=par_student_booking_id
     )
    UNION
    (SELECT
        student_booking_school_transfer_price as amount
     FROM
        tbl_student_booking_school_transfer
     WHERE
        student_booking_id=par_student_booking_id
     )
) x

INTO var_total;

IF var_total IS NULL THEN
    SET r = 0;
END IF;

-- discount 
SET var_discount = (SELECT
    sb.student_booking_discount_amount
FROM
    tbl_student_booking sb
WHERE
    sb.student_booking_id=par_student_booking_id LIMIT 1);

IF var_discount IS NOT NULL THEN
   SET r = var_total - var_discount;
end if;


return r;

END

价值观是: 9698.88当然 559.55住宿 559.55保险 145.98折扣

似乎函数内部的第一个查询,只对不同的值求和,因为折扣的结果是:10112.45,所以不是总和559.55的一个值,我试图输出不同的东西作为concat用字符串只看到结果为9698.88course,559.55住宿等。这很好。所以我假设问题是如果值等于则不能求和。奇怪的是,从控制台运行它,只有函数外的查询,它总结确定。

我的问题是这是MySql的正常行为吗?如果有,有办法防止这种情况发生吗?这是一个错误吗?

1 个答案:

答案 0 :(得分:1)

这里需要的是UNION ALL条款:

SELECT 
sum(x.amount)
FROM
(
(SELECT
    student_booking_school_course_price as amount
 FROM
    tbl_student_booking_school_course
 WHERE
    student_booking_id=par_student_booking_id
 )
UNION ALL
(SELECT
    student_booking_school_accommodation_price as amount
 FROM
    tbl_student_booking_school_accommodation
 WHERE
    student_booking_id=par_student_booking_id
 )
UNION ALL
(SELECT
    student_booking_school_insurance_price as amount
 FROM
    tbl_student_booking_school_insurance
 WHERE
    student_booking_id=par_student_booking_id
 )
UNION ALL
(SELECT
    student_booking_school_transfer_price as amount
 FROM
    tbl_student_booking_school_transfer
 WHERE
    student_booking_id=par_student_booking_id
 )
) x

INTO var_total;

MySQL UNION文档说:

  

可以使用UNION DISTINCT或显式生成DISTINCT联合   隐式使用UNION,没有后续的DISTINCT或ALL关键字。