3

我有一个嵌套的 SQL 查询:

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

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

4

3 回答 3

2

SQL Server 确实允许视图中的子查询。你不能做的是SELECT *GROUP BY a, b

您是否尝试过...(我假设这不是您的全部查询,因此我会做出尽可能少的更改)

SELECT asset_id, workflow_element_id
FROM
(
    SELECT *
    FROM asset_status
    -- ORDER BY session_id DESC   (Removed as innefective in a view)
) tmp
GROUP BY asset_id, workflow_element_id


另外,请注意内部查询中的 ORDER BY 是无效的(甚至可能是不允许的),因为然后允许外部查询重新排序它(它不会总是以不同的顺序返回,但是这种布局不保证您似乎想要的顺序)。即使在外部查询中,它也可能导致您在使用视图时对结果进行排序,但再次允许优化器对结果进行重新排序。除非 ORDER BY 在使用视图的查询中,否则永远不会绝对保证顺序...

SELECT * FROM view ORDER BY x


最后,您将此标记为 LEFT JOIN 问题。如果您有更完整的代码示例,我相信有人会建议另一种布局。但是我现在要出去几天了。祝你好运!:)

于 2012-02-13T16:56:35.127 回答
0

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

SELECT DISTINCT asset_id, workflow_element_id
FROM asset_status

例如,如果您需要按顺序订购,session_id则必须将其包含在聚合max中。(或在组中)

SELECT asset_id, workflow_element_id
FROM asset_status
GROUP BY asset_id, workflow_element_id
ORDER BY MAX(session_id) DESC
于 2012-02-13T16:57:19.167 回答
0

根据MySQL 参考手册,您可以创建使用子查询的视图,但不能在 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

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

于 2012-02-13T17:50:51.813 回答