Mysql在一个查询中多次使用存储过程结果

Mysql在一个查询中多次使用存储过程结果,mysql,sql,Mysql,Sql,我的MySQL数据库中有一个存储过程,运行良好 但是,由于我必须在同一个查询中使用相同的参数调用相同的过程3次,因此如果我可以使用第一次调用的结果而不是后续调用,这将是一个很好的性能改进 编辑:更改示例,因为它是过于简单、误导性的答复 我必须列出:产品和价格-价格根据一年中的时间和付款方式而变化,所以结构是:(id,product,date,from,date,to,price,mode,1,price,mode,3) 例如: 我现在做的是 SELECT products.*,

我的MySQL数据库中有一个存储过程,运行良好

但是,由于我必须在同一个查询中使用相同的参数调用相同的过程3次,因此如果我可以使用第一次调用的结果而不是后续调用,这将是一个很好的性能改进

编辑:更改示例,因为它是过于简单、误导性的答复

我必须列出:产品和价格-价格根据一年中的时间和付款方式而变化,所以结构是:(id,product,date,from,date,to,price,mode,1,price,mode,3)

例如:

我现在做的是

SELECT products.*, 
       get_a_quote(products.id,date_to,date_from, quantity_mode_1,quantity_mode_2,quantity_mode_3) 
  FROM peoducts 
 WHERE get_a_quote(products.id,date_to,date_from, quantity_mode_1,quantity_mode_2,quantity_mode_3)  >0 
ORDER BY 
       get_a_quote(products.id,date_to,date_from, quantity_mode_1,quantity_mode_2,quantity_mode_3) 
LIMIT 10
我想做的是

SELECT products.*, 
       get_a_quote(products.id,date_to,date_from, quantity_mode_1,quantity_mode_2,quantity_mode_3)  into quote
  FROM peoducts 
 WHERE quote  >0 
ORDER BY 
       quote
LIMIT 10
这可能吗

*编辑:功能代码*


谢谢大家

在我看来,从语义上看,您正在表上添加一个新的依赖列。您可以使用以下视图:

CREATE VIEW v AS
SELECT customers.*, 
   get_a_quote(products.id,date_to,date_from, quantity_mode_1,quantity_mode_2,quantity_mode_3) AS total
FROM customers;
然后,您只需在查询中使用它:

SELECT *
FROM v
WHERE total >0 
ORDER BY 
    total 
LIMIT 10;
但是,同样,在表上使用连接可以更好地实现函数所做的工作,例如:

SELECT customers.*, 
       SUM(orders.value) 
FROM
    customers
    JOIN orders ON
         customers.id=orders.customer_id 
GROUP BY customers.id
HAVING SUM(orders.value)  >0 
ORDER BY 
    SUM(orders.value) 
LIMIT 10;

您可以向我们显示您的功能代码吗?

您可以在派生表中执行此操作:

SELECT *
FROM (
    SELECT customers.*, 
           totalOrders (customers.id) AS total
      FROM customers
) AS t 
 WHERE total >0 
ORDER BY 
       total 
LIMIT 10
但是,我不会为此使用存储函数。它肯定会有令人难以置信的糟糕表现


我会使用JOIN,这样我只能获取订单数超过零的客户。

您能输入完整的SP代码吗?总值是要存储在变量中的值吗?您谈论的是函数,而不是过程。不同的情况……即使只进行一次调用,这在表型上也是低效的——将应用程序逻辑从函数展开到查询本身可能更合适。我知道,这是一个函数,我的错误。问题是,它无法展开到查询、联接或其他任何内容中。唯一的另一种方法是将函数中的应用程序逻辑移到php中,但这在我看来更糟。那你为什么说一个电话都没效率?MySQL中的函数有那么糟糕吗?它必须是一个函数,它不仅仅是一个名字所暗示的求和,它还有一些IFs和更多的数学运算。那么,您认为这个派生表会比我现在使用的3个函数调用的性能提高吗?我们已经用php的microtime进行了一段时间的测试,您的解决方案比我的效率大约高30%。谢谢!发布了更多信息,我认为它不能用视图来完成,因为函数结果随请求的不同而不同,这不是一个简单的总数。我完全不明白为什么不能用视图来完成:你能试着用视图来运行我的视图定义和下面的查询,并告诉我们你得到了什么错误消息吗?我不会得到错误,只是这样,每当用户需要报价时,我必须创建一个不同的视图,选择它,然后在他需要不同报价时删除它。这似乎比我现在正在做的3个函数调用效率更低,我错了吗?如果没有看到函数的主体,很难猜测代码到底在做什么。也就是说,您还可以使用另一个包装器函数来完成所有工作。但这似乎并不比您最初的查询更简单。-@symcbean关心的是,在最好的情况下,每行调用一次函数(如果不是3次的话)。这就是为什么功能主体是相关的。
SELECT *
FROM (
    SELECT customers.*, 
           totalOrders (customers.id) AS total
      FROM customers
) AS t 
 WHERE total >0 
ORDER BY 
       total 
LIMIT 10