Mysql 将子查询转换为联接以创建视图

Mysql 将子查询转换为联接以创建视图,mysql,sql,subquery,nested-queries,Mysql,Sql,Subquery,Nested Queries,我有一个嵌套的SQL查询: SELECT * FROM ( SELECT * FROM asset_status ORDER BY session_id DESC ) tmp GROUP BY asset_id, workflow_element_id 我想从这个查询中创建一个视图,但MySQL似乎不允许在视图中使用子查询。如何将其转换为联接?SQL Server允许在视图中进行子查询。您不能做的是选择*并按a、b分组 你试过。。。(我假设这不是您的全部查询,因此我将

我有一个嵌套的SQL查询:

SELECT * 
FROM
(
    SELECT *
    FROM asset_status
    ORDER BY session_id DESC
) tmp
GROUP BY asset_id, workflow_element_id

我想从这个查询中创建一个视图,但MySQL似乎不允许在视图中使用子查询。如何将其转换为联接?

SQL Server允许在视图中进行子查询。您不能做的是
选择*
按a、b分组

你试过。。。(我假设这不是您的全部查询,因此我将进行尽可能少的更改)


另外,请注意,内部查询中的ORDER BY是无效的(甚至可能是不允许的),因为外部查询随后被允许对其重新排序(它不会总是以不同的顺序返回,但此布局并不能保证您想要的顺序)。即使在外部查询中,使用视图时也可能导致结果有序,但同样允许优化者对结果重新排序。除非ORDER BY在使用视图的查询中,否则该顺序永远不会得到绝对保证



最后,您将其标记为左连接问题。如果您有一个更完整的代码示例,我相信有人会建议一个替代布局。但我现在要出去几天。祝你好运!:)

不需要子查询,因为根本不保证使用内部order by。你可以写:

SELECT DISTINCT asset_id, workflow_element_id
FROM asset_status
如果您需要按
session\u id
订购,则必须将其包含在聚合中,例如
max
。(或在组员中)

根据,可以创建使用子查询的视图,但不能在From子句中创建

因此,我认为您需要创建如下视图:

select a.* 
from asset_status a
join (select asset_id, workflow_element_id, MAX(session_id) session_id
      from asset_status
      group by asset_id, workflow_element_id) sq
  on a.session_id = sq.session_id

但是,它的性能可能不如您原来的查询。

asset_status的列是什么?这是MySQL,不是SQLServer。我只为order by添加了子查询。既然您说order by不能保证,我将尝试聚合
max
您的查询如何处理会话id的排序顺序?此查询不返回预期的记录。我正在尝试检索不同工作流的资产状态。这些结果需要来自最新的会话。@apurv:您的原始查询似乎是为了返回资产标识和工作流元素标识的每个组合的最新资产标识状态记录(即具有最高会话标识)。max(会话标识)的使用与分组相结合,应根据资产id和工作流元素id的组合选择最高的会话id。此查询的结果与预期结果有何不同?你能在你的问题中包括一些样本数据吗?
SELECT DISTINCT asset_id, workflow_element_id
FROM asset_status
SELECT asset_id, workflow_element_id
FROM asset_status
GROUP BY asset_id, workflow_element_id
ORDER BY MAX(session_id) DESC
select a.* 
from asset_status a
join (select asset_id, workflow_element_id, MAX(session_id) session_id
      from asset_status
      group by asset_id, workflow_element_id) sq
  on a.session_id = sq.session_id