【问题标题】:Converting subquery to Join (MySQL) [closed]将子查询转换为加入(MySQL)[关闭]
【发布时间】:2021-06-20 13:03:02
【问题描述】:

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

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

【问题讨论】:

  • 实际上在这种情况下我们不需要示例,但我同意这个问题可能太简单了,可能已经在某个地方回答了

标签: mysql sql join subquery


【解决方案1】:

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

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

【讨论】:

  • 不幸的是它不起作用;(我看到语法错误(SQL 错误 1064)
  • @Artem 添加了加入的答案。固定
  • 太棒了!非常感谢!
【解决方案2】:

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

    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

【讨论】:

  • 非常感谢,但是 JOIN 子句呢?
  • 特别是对于 MySQL,这是不必要的冗长
  • @Artem 加入?您只能从一个表中进行选择,很抱歉您失去了我。如果没有相关性,您将无法加入任何内容。
  • 事实上我什至没有发现你的选择 *,所以道歉 leftjoin 的查询更合适,为什么你想让它不必要地占用更多资源是一个谜,从那里的单个表中选择不需要加入任何聚合函数;样本数据和所需的输出会有所帮助:-))
  • 我怕如果我用子查询代替join,那么随着表大小的显着增加,整体性能会急剧下降
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2020-12-23
  • 2021-01-28
相关资源
最近更新 更多