MySQL 存储过程 SELECT、三个 WHERE CLAUSE 值和 ORDER BY

Posted

技术标签:

【中文标题】MySQL 存储过程 SELECT、三个 WHERE CLAUSE 值和 ORDER BY【英文标题】:MySQL Stored procedure SELECT, three WHERE CLAUSE values and ORDER BY 【发布时间】:2014-05-06 22:06:46 【问题描述】:

我的存储函数似乎不起作用,我得到了 10 行 NULL 和 40 个警告的返回。

我想编写一个存储函数,返回在开始日期 D1 和结束日期 D2 之间为 customer_id X 支付的最高金额。

表格结构如下:

sales(customer_id CHAR(1), date DATE, paid INT)

示例行:

sales(A, 2014-12-20, 3456)

我的存储函数:

DELIMITER $$
    CREATE FUNCTION highest_monthly_paid(x CHAR(1), D1 DATE, D2 DATE) 
      RETURNS INT
      DETERMINISTIC
    BEGIN
        DECLARE highest_fee INT;

        SELECT paid INTO highest_fee
        FROM sales
        WHERE customer_id = x 
        AND date > D1
        AND date < D2
        ORDER BY paid DESC LIMIT 1;
        RETURN highest_fee;
    END
    $$

这不起作用还是我最好使用某种子查询?如果这两种方法都有效,我应该使用哪一种?

我尝试过MAX(paid) 而不是LIMIT

我对调用函数的查询:

SELECT highest_monthly_paid(A,  2013-12-10,  2013-12-25)
FROM sales;

数据库中有两行customer_id为A:

+-------------+-------+----------+------------+--------+
| customer_id | model | quantity | day        | paid   |
+-------------+-------+----------+------------+--------+
| A           | 2002  |        2 | 2013-12-19 |   1898 |
| A           | 3002  |        1 | 2013-12-18 |    239 |
+-------------+-------+----------+------------+--------+

我的结果:

mysql> SELECT highest_monthly_paid(A,  2013-12-10,  2013-12-25)
    -> FROM sales;
+------------------------------------------------------------+
| highest_monthly_paid(A,  2013-12-10,  2013-12-25) |
+------------------------------------------------------------+
|                                                       NULL |
|                                                       NULL |
|                                                       NULL |
|                                                       NULL |
|                                                       NULL |
|                                                       NULL |
|                                                       NULL |
|                                                       NULL |
|                                                       NULL |
|                                                       NULL |
+------------------------------------------------------------+
10 rows in set, 30 warnings (0.00 sec)

【问题讨论】:

警告是什么? 您的函数不是确定性的,我确定您的 customer_id 不是CHAR(1) 类型。如果它应该是你不能有很多客户......费用的最佳数据类型是DECIMAL,而不是INT。 看看将有限制的SELECT paid 更改为SELECT Max(Paid),而不是没有限制,开始。很难告诉你为什么它不能在没有样本数据和所需输出、没有明确描述所涉及的数据类型以及没有说明你如何调用函数的情况下工作。 如果char(1)字段是正确的unicode字段,那么它应该能够包含与unicode字符一样多的不同值,超过110万。但仍然不是很实用和可读。通常 INT 更适合 ID 2013-12-10 不是日期,它是一个数字:2013 minus 12 minus 10 如果您希望 MySQL 将其识别为日期,请将其放在单引号中:'2013-12-10' 【参考方案1】:

我认为以下查询应该足以获取给定日期范围内每个客户的最高费用。如果您有其他要求,请告诉我们。

SELECT customer_id, MAX(paid) AS highest_fees
FROM sales
WHERE date BETWEEN '2013-12-10' AND '2013-12-25'
GROUP BY customer_id

【讨论】:

以上是关于MySQL 存储过程 SELECT、三个 WHERE CLAUSE 值和 ORDER BY的主要内容,如果未能解决你的问题,请参考以下文章

从存储过程 Mysql (Laravel + SPA) 获取多表输出

MYSQL存储过程select语句select不正确的ID

MySQL 存储过程不适用于 SELECT(基本问题)

MySQL 存储过程不适用于 SELECT(基本问题)

MySQL 在 select 语句中使用存储过程

MySql存储过程