【问题标题】:Insert a subquery count from a main SQL query从主 SQL 查询插入子查询计数
【发布时间】:2019-06-12 21:19:56
【问题描述】:

我必须在我的电子商务后台列出一些客户订单。

我在php订单页面工作

此查询工作正常。大约需要 4 秒。 :

 select o.orders_id, o.customers_email_address, o.transaction_id,
 o.customers_name, o.payment_method, o.date_purchased, o.last_modified,
 o.currency, o.currency_value, s.orders_status_name, ot.text as
 order_total
from TABLE_ORDERS  o left join TABLE_ORDERS_TOTAL ot on
 (o.orders_id = ot.orders_id), TABLE_ORDERS_STATUS s
 where o.orders_status = s.orders_status_id
and ot.class = 'ot_total'
order by o.orders_id DESC

我现在尝试将列出的每个客户的订单总数相加。

这个独立的查询也可以正常工作:

select count(o.orders_id) as total_ord
from TABLE_ORDERS o
where o.customers_email_address = '" . $orders['customers_email_address'] . "'

使用从上一个查询中提取的 $orders['customers_email_address']。

现在该页面需要 9 到 10 秒来列出客户订单和每位客户的订单数量。

有没有办法合并到主查询和子查询计数以减少请求时间? 我尝试了一些左连接,但没有成功。

感谢您的帮助

【问题讨论】:

    标签: php sql


    【解决方案1】:

    首先修复JOINs。 , 是过时的,WHERE 子句将LEFT JOIN 变成INNER JOIN

    您可以尝试使用窗口函数计算订单总数:

    select o.orders_id, o.customers_email_address, 
           o.transaction_id,
           o.customers_name, o.payment_method, 
           o.date_purchased, o.last_modified,
           o.currency, o.currency_value, s.orders_status_name, 
           ot.text as order_total,
           o.total_ord
    from (select o.*,
                 count(*) over (partition by o. customers_email_address) as total_ord
          from table_orders  o
         ) o join
         table_orders_total ot
         on o.orders_id = ot.orders_id join
         table_orders_status s
         on o.orders_status = s.orders_status_id
    where ot.class = 'ot_total'
    order by o.orders_id desc
    

    【讨论】:

    • 谢谢戈登。我有一个错误:' 1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册以获取正确的语法,以便在第 1 行的 '(partition by o.customers_email_address) as total_ord from table_orders o) o joi' 附近使用 select count() as total from (select o .,count(*) over (partition by o.customers_email_address) as total_ord from table_orders o) o join table_orders_total ot on o.orders_id = ot.orders_id join table_orders_status s on o.orders_status = s.orders_status_id where ot. class= 'ot_total'' 我仔细检查了语法
    • ,深入挖掘后:MySql 不支持窗口函数。
    • @SebastienR。 . . .当然可以。您只是在使用旧版本。
    • 好的。很抱歉没有提到这一点。非常感谢戈登的帮助。
    【解决方案2】:

    深挖后:MySql 不支持窗口功能。

    因此,在 Gordon Linoff 的帮助下,我重新编写了适用于计数子查询的查询。

    缺点:14 秒!而不是 9 秒。太糟糕了,我必须像以前一样使用 2 个查询。

    反正我什么都没学到。

    有效但查询时间过长:

       select o.orders_id, o.customers_email_address, 
           o.transaction_id, o.customers_name, o.payment_method, 
           o.date_purchased, o.last_modified,
    o.currency, o.currency_value, s.orders_status_name, 
           ot.text as order_total,
      (select count(orders_id) FROM TABLE_ORDERS WHERE customers_email_address = o.customers_email_address) as total_ord
          from table_orders o join
         table_orders_total ot
         on o.orders_id = ot.orders_id join
         table_orders_status s
         on o.orders_status = s.orders_status_id
    where ot.class = 'ot_total'
    order by o.orders_id desc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多