【发布时间】:2020-09-26 15:39:08
【问题描述】:
我认为VIEW 中的列只是继承了底层TABLE 中使用的数据类型,但事实并非如此。
我有一个 MySQL TABLE 喜欢:
"myTable"
FIELD TYPE NULL KEY DEFAULT EXTRA id int(11) NO PRI NULL auto_increment dt datetime NO MUL NULL foo smallint(5) unsigned NO NULL
我可以像这样查询表:SELECT dt, SUM(foo) FROM myTable WHERE dt>DATE_SUB(Now(), INTERVAL 3 DAY) GROUP BY dt
现在我需要能够查询相同的数据,但对某些列使用备用名称(例如“foo”)。
[我将跳过对为什么的冗长解释!]
我认为一个简单的解决方案是VIEW:CREATE VIEW myView AS ( SELECT id, dt, grps AS groups FROM myTable ORDER BY dt )
这会创建一个包含如下列的视图:
"myView"
FIELD TYPE NULL KEY DEFAULT EXTRA id int(11) NO 0 dt datetime NO NULL foobar smallint(5) unsigned NO NULL
问题出现在我查询视图时:(几乎与上一个查询相同)
SELECT dt, SUM(foobar) AS foo FROM myView WHERE dt>DATE_SUB(Now(), INTERVAL 3 DAY) GROUP BY dt
查询运行时未产生错误,但响应为零记录。
我发现如果我像这样CASTWHERE 子句,那么它可以正常工作(尽管它非常缓慢。)
。 . . WHERE CAST(dt>DATE_SUB(Now(), INTERVAL 3 DAY)
CASTing 所有列会很乏味,而且它会大大减慢查询的执行速度。 (有 500 万条记录并且还在增长。)
为什么 sql 强制我重新转换字段?我该怎么办?
谢谢!
【问题讨论】:
-
首先从视图的创建文本中删除
ORDER BY dt。很可能它会在下一步中放慢速度。 -
从视图定义中删除
ORDER BY确实有帮助。我仍然认为空结果集是一个错误,并将为此创建一个错误报告...... -
@BarbarosÖzhan - 修复了它!谢谢 - 但是……嗯?!为什么排序基础记录(按日期)会导致分组时(按日期)不返回任何记录?
-
@BarbarosÖzhan - 如果您想将其更改为答案(如果可能,请提供解释?!)然后我会接受答案
标签: mysql database data-structures view mariadb