为啥在 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?的主要内容,如果未能解决你的问题,请参考以下文章