为啥在 MySQL 中每个有效的 SELECT 都不是有效的 VIEW?

Posted

技术标签:

【中文标题】为啥在 MySQL 中每个有效的 SELECT 都不是有效的 VIEW?【英文标题】:Why is in MySQL every valid SELECT not a valid VIEW?为什么在 MySQL 中每个有效的 SELECT 都不是有效的 VIEW? 【发布时间】:2011-03-24 23:24:39 【问题描述】:

我想按天分组。以下 SELECT 工作正常:

  SELECT COUNT( time_end ), 
         time_end
    FROM main
GROUP BY DAY( time_end )

我将其复制/粘贴到 phpmyadmin 的 VIEW 创建表单中,并收到此错误:

"#1064 - 您的 SQL 语法有错误;请查看与您的 mysql 服务器版本相对应的手册,了解在 'count(time_end)) AS SELECT count( time_end ) , time_end 附近使用的正确语法FROM main GROUP BY d' 第 4 行"

这是从 phpmyadmin 的表单生成的完整 SQL:

CREATE ALGORITHM = UNDEFINED VIEW `count by day` (
  time_end,
  count( time_end )
) AS SELECT COUNT( time_end ), 
            time_end
       FROM main
   GROUP BY DAY( time_end ) 

怎么了?为什么有效的 SELECT 不会自动成为有效的 VIEW 创建?谢谢。

【问题讨论】:

【参考方案1】:

不知道 phpMyAdmin 从哪里获得该语法。使用:

CREATE VIEW COUNT_BY_DAY AS
  SELECT COUNT( time_end ), 
         time_end
    FROM main
GROUP BY DAY( time_end )

请注意,您依赖于 MySQL's hidden column functionality - time_end 值将是任意的(不能依赖于始终返回与可供选择的值数量增加相同的值)。它也不能移植到大多数数据库,你必须重新编写它。

此外,如果您不按月份进行限制,那么第 28 天到第 31 天的计数会出现偏差。并非所有月份都有 31 天。

【讨论】:

【参考方案2】:

您查询的唯一问题是您的列名没有反引号。

创建算法 = 未定义视图 count by day ( `count( time_end )` # 你需要把它放在反引号中 时间结束, ) AS SELECT COUNT(time_end), 时间结束 来自主 按天分组(time_end)

对于它的价值,你有错误的方式列名。

您使用的语法是视图列名称的显式命名。它允许您为从查询列派生的列命名,例如

CREATE VIEW X AS
SELECT time_end, other1
FROM main

:: X contains the columns `time_end` and `other1`

CREATE VIEW X ( TheStopTime, DataPoint ) AS
SELECT time_end, other1
FROM main

:: X contains the columns `TheStopTime` and `DataPoint`

【讨论】:

以上是关于为啥在 MySQL 中每个有效的 SELECT 都不是有效的 VIEW?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要在 MySQL 中使用 EXISTS() 函数?

为啥在 MySQL 查询中每个值前面都使用字母?

MYSQL 学习笔记记录整理之二:分组数据

为啥我们不应该在生产服务器上的 mysql 查询中使用 Select *?

Mysql分页优化

SQL 脚本在 MySQL 中有效,但 mysqli->query() 失败;为啥?