我无法在 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 子句中创建包含子查询的视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在 from 子句中使用子查询创建视图 - Mariadb