将子查询转换为 Join (MySQL)

Converting subquery to Join (MySQL)

是否可以将这些子查询转换为连接子句?

SELECT ods.*,
            (SELECT COUNT(*) FROM orders) tot_ords,
            (SELECT COUNT(*) FROM orders WHERE order_confirmed = 'yes') yes_ords,
            (SELECT COUNT(*) FROM orders WHERE order_confirmed = 'no') no_ords
FROM orders ods
ORDER BY ods.order_confirmed = 'yes' DESC

没有连接也没有子查询,使用分析:

SELECT ods.*,
       COUNT(*) OVER()          tot_ords,
       COUNT(case when order_confirmed = 'yes' then 1 else null end) OVER() yes_ords,
       COUNT(case when order_confirmed = 'no' then 1 else null end) OVER() no_ords
FROM orders ods
ORDER BY ods.order_confirmed = 'yes' DESC

使用连接:

   SELECT ods.*, 
          s.tot_ords,
          s.yes_ords,
          s.no_ords 
     FROM orders ods
          cross join (select 
                             COUNT(*) tot_ords,
                             COUNT(case when order_confirmed = 'yes' then 1 else null end)  yes_ords,        
                             COUNT(case when order_confirmed = 'no' then 1 else null end)  no_ords 
                       from orders
                       ) s
    ORDER BY ods.order_confirmed = 'yes' DESC

你可以简单地使用条件聚合,

    select *, Count(*) over() tot_ords,
        Sum(case when order_confirmed ='yes' then 1 else 0 end) over() yes_ords,
        Sum(case when order_confirmed ='no' then 1 else 0 end) over() no_ords
    from orders
  from orders ods
  order by ods.order_confirmed = 'yes' DESC