mysql - 错误结果 mysql 仅在函数中

标签 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类(class) 559.55 住宿 559.55 保险 145.98 折扣

函数内的第一个查询似乎只对不同的值求和,因为折扣的结果是:10112.45,所以不是对 559.55 的一个值求和,我尝试将不同的东西输出为与字符串连接,但只看到结果是9698.88类(class),559.55住宿等等,还可以。所以我认为问题是如果值相等则不会求和。奇怪的是,从控制台运行这个,只有函数外部的查询,结果就ok了。

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

最佳答案

这里您需要的是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文档说:

A DISTINCT union can be produced explicitly by using UNION DISTINCT or implicitly by using UNION with no following DISTINCT or ALL keyword.

关于mysql - 错误结果 mysql 仅在函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35429464/

相关文章:

MySQL 选择具有相同字段值的多个连接对象的记录

php - 如何附加数据库中已存在的序列化字符串

php - 在 SQL 中创建表和字段的脚本不起作用

php - Cakephp从多个表中获取数据

mysql - 'modules.modules_id' 中的未知列 'on clause'

php - WordPress数据库错误: You have an error in your SQL syntax

php - 左连接两个表,多列

MySQL 平均函数未返回预期结果

php - 当MySQL中有多个条件时,如何计算排名

mysql - 从表中选择所有行并为每行连接表中的匹配行