【发布时间】:2018-04-25 02:31:17
【问题描述】:
我有一个超过 300,000 行的表,我想在图表上呈现这些数据,但 300,000 行并不是一次全部必要的。例如,即使某一天可能有 100 行数据,但如果我要显示一整年的数据,我不需要显示所有这些数据。所以我想“细化”数据。
我正在考虑获取所有内容,然后使用脚本删除我不需要的内容,但这似乎在数据库上会更慢更难。
这就是我目前所拥有的。
SET @row_number := 0;
SELECT @row_number := @row_number + 1 as row_number,
price, region, timestamp as row_number FROM pricehistory;
这给了我所有的行和编号。我打算添加一个 where 子句来获取每 1000 行(即每 n 行)这样的
SET @row_number := 0;
SELECT @row_number := @row_number + 1 as row_number,
price, region, timestamp as row_number FROM pricehistory
WHERE row_number % 1000 = 0;
但由于某种原因,MYSQL 没有将row_number 视为一列。有任何想法吗?我在网上查看了其他解决方案,但它们似乎不适用于 MYSQL。
【问题讨论】:
-
行有唯一的 ID 吗?
-
不要费心添加计算列。如果 ID 是连续的,只需使用它即可。它不会那么准确,但这在您的情况下似乎并不重要,好消息是它会更快。另一种方法是使用带有
LIMIT x, 1000的子查询来为您提供间隔。 -
您不能在 WHERE 子句中使用来自 SELECT 子句的别名;在将 WHERE 应用于原始 FROM 结果之前,这些结果字段基本上不存在。唯一不会对数据库“更难”的方法是它发送的结果更少;否则,它在工作时会更加繁琐。 您也不能在 SELECT 中使用两次相同的别名。
-
@Uueerdo 好的,那么从技术上讲,
"@row_number := @row_number + 1" % 1000 = 0会被识别吗? -
@RacilHilan 我可能最终会这样做。特别是如果它更快。