我无法在 FROM 子句中创建包含子查询的视图

Posted

技术标签:

【中文标题】我无法在 FROM 子句中创建包含子查询的视图【英文标题】:I cannot create view which contains a subquery in the FROM clause 【发布时间】:2013-02-14 11:19:44 【问题描述】:

数据来源是:

Start Time              Real End Time           Staff
2013-02-14 16:44:27     2013-02-14 18:44:27     P 
2013-02-14 16:44:08     2013-02-14 17:09:08     C
2013-02-14 16:42:51     2013-02-14 16:43:51     P
2013-02-14 16:31:26     2013-02-14 17:06:26     V
2013-02-14 16:04:02     2013-02-14 16:34:02     C

当我使用时:

CREATE VIEW turn_times AS
SELECT staff AS name, start_time, real_end_time AS work_end_time
FROM (  SELECT staff, start_time, real_end_time
        FROM treatments 
        WHERE date(real_end_time) = curdate()
        ORDER BY real_end_time ASC) AS a
GROUP BY name

我明白了:

mysql #1349 - View's SELECT contains a subquery in the FROM clause

我想通过使用视图获取以下数据,有什么好的解决办法:

name    start_time             work_end_time
C       2013-02-14 16:04:02    2013-02-14 16:34:02
P       2013-02-14 16:42:51    2013-02-14 16:43:51
V       2013-02-14 16:31:26    2013-02-14 17:06:26

我不想为这个问题创建两个视图,我可以在一个视图中得到正确的sql吗?

【问题讨论】:

【参考方案1】:

您是否尝试使用聚合函数 (MIN) 为每个 staff 返回 min() 日期,而不是使用带有 ORDER BY 的子查询:

SELECT staff, 
  min(start_time),
  min(real_end_time)AS work_end_time
FROM treatments 
WHERE date(real_end_time) = curdate()
group by staff

见SQL Fiddle with Demo。

然后变成一个视图:

CREATE VIEW turn_times AS
SELECT staff, 
  min(start_time),
  min(real_end_time)AS work_end_time
FROM treatments 
WHERE date(real_end_time) = curdate()
group by staff

上面的这个版本复制了你提供的结果,但是如果你想要结束时间,你可能想要使用下面的。这将为您提供每个员工的实际开始时间和结束时间:

CREATE VIEW turn_times AS
SELECT staff, 
  min(start_time) as start_time,
  max(real_end_time) AS work_end_time
FROM treatments 
WHERE date(real_end_time) = curdate()
group by staff

见SQL Fiddle with Demo

【讨论】:

是的,我尝试使用 max,但它好像错了。无论如何,非常感谢 @Victor 我使用了min,因为您要按升序对数据进行排序。您也可以使用min(start_time)max(real_end_time) 嘿 bluefeet.. 我有一个类似的问题.. 没有发布问题,因为它有点相似,并认为可以在这里解决.. 我在子查询中找到 counts 和然后是外部查询中的counts 中的sums。同样的错误。我该如何解决?如果你愿意,我会开始一个新问题。谢谢! :) @CodingInCircles 发布一个新问题会更容易。我可以看到所有细节,我们不会在 cmets 中来回走动。发布后,请随时在此处的评论中发布链接。 :) 嗨,bluefeet,很抱歉延迟提出这个问题。这是:***.com/questions/15232965/mysql-view-with-a-subquery。谢谢!【参考方案2】:

不清楚为什么要使用子查询,但是不使用子查询也可以达到类似的结果

CREATE VIEW turn_times AS
SELECT staff AS name, 
  MIN(start_time) AS start_time,
  MAX(real_end_time) AS work_end_time,
  date(start_time) As turn_date
FROM treatments 
WHERE 
AND date(start_time) = curdate()
AND date(real_end_time) = curdate()
GROUP BY staff, date(start_time);

【讨论】:

以上是关于我无法在 FROM 子句中创建包含子查询的视图的主要内容,如果未能解决你的问题,请参考以下文章

使用子查询的替代方法 - 无法在 Mysql 中创建视图

View 的 SELECT 包含 FROM 子句中的子查询

如何在 from 子句中使用子查询创建视图 - Mariadb

在 FROM 子句中创建大型虚拟表

MYSQL 获取最低值的记录 | View 的 SELECT 包含 FROM 子句中的子查询

ON 子句 Laravel ORM 中的子查询