【问题标题】:I cannot create view which contains a subquery in the FROM clause我无法在 FROM 子句中创建包含子查询的视图
【发布时间】: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吗?

【问题讨论】:

    标签: mysql view mysql-workbench


    【解决方案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,很抱歉延迟提出这个问题。这是:stackoverflow.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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 2020-02-08
      • 2012-09-29
      • 2018-08-08
      • 1970-01-01
      • 2012-01-15
      相关资源
      最近更新 更多