【问题标题】:Left join the result of subquery in mysql左连接mysql中子查询的结果
【发布时间】:2021-09-25 14:41:02
【问题描述】:

我想执行以下操作,但它不起作用。我想离开加入子查询的结果。

select result1.id, result.name from (select cust.id as id, cust.name as name, ss.sold_date as soldDate, pp.product_name as productName from customers cust
left join sales ss on ss.customer_id = cust.id
left join products pp on pp.id = ss.product_id) as result
left join result as result1 on result.id = result1.id

当我这样做时,它说表“结果”不存在。如何离开加入结果别名?

【问题讨论】:

  • 首先,让我说清楚。您是否尝试将子查询与自身连接?
  • @ekochergin 是的,没错。这有可能吗?假设子查询结果是一个包含我需要的数据的表。然后我需要自己加入子查询结果表来做一些操作,比如计数、求和等。我希望它有意义。
  • 你能说明你想用“计数、总和等”做什么吗?我不清楚您如何需要子查询的自连接来执行任何操作。但如果你这样做,你会为此使用一个公用表表达式
  • 请显示select version();的输出

标签: mysql sql join left-join


【解决方案1】:

根据您的评论,您正在尝试将子查询结果与其自身连接。

在这种特殊情况下,它没有任何意义,因为您只会获得两次相同的数据。所以,使用子查询一次就可以了

select result1.id, result.name 
  from (select cust.id as id, cust.name as name, ss.sold_date as soldDate, pp.product_name as productName 
          from customers cust
          left join sales ss on ss.customer_id = cust.id
          left join products pp on pp.id = ss.product_id) as result
  left join result as result1 on result.id = result1.id

一般来说,如果你需要使用相同的子查询两次,你可以使用 CTE(common-table-expression):

with sub_q as (select cust.id as id, cust.name as name, ss.sold_date as soldDate, pp.product_name as productName 
          from customers cust
          left join sales ss on ss.customer_id = cust.id
          left join products pp on pp.id = ss.product_id)

select *
  from sub_q res
  left join sub_q res1
    on res.id = res1.id

CTE(上面查询的“with”部分)就像一个变量。在“通常”的编程语言中,变量用于存储值,而在查询语言中,它的工作是存储查询

UPD。 OP 似乎在 8.0 之前的 mysql 版本上,并且 db OP 不支持 CTE

所以,在这里你可能最终会使用视图

首先,一个创建视图的脚本

create view sub_q as select cust.id as id, cust.name as name, ss.sold_date as soldDate, pp.product_name as productName 
          from customers cust
          left join sales ss on ss.customer_id = cust.id
          left join products pp on pp.id = ss.product_id;

其次,运行查询

select *
  from sub_q res
  left join sub_q res1
    on res.id = res1.id;

或者,您可以在 select 语句中重复子查询两次

【讨论】:

  • 感谢您的澄清。出于某种原因,我尝试了这个并得到了语法错误。 select result1.id, result.name with sub_q as (select cust.id as id, cust.name as name, ss.sold_date as soldDate, pp.product_name as productName from customers cust left join sales ss on ss.customer_id = cust. id left join products pp on pp.id = ss.product_id) select * from sub_q result left join sub_q result1 on result.id = result1.id
  • @user3376592 “with”部分在任何“select”之前先出现。就像我在答案的第二个示例中所做的那样
  • 我也试过了。看起来 with 仅支持 8.0 之前的 mysql 版本。还有其他选择吗?
  • @user3376592 你用的是什么版本?
  • 我用的是最新版的Heidisql 11版
猜你喜欢
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 2020-02-14
相关资源
最近更新 更多