作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个保存加密货币价格数据的数据库。价格数据请求如下所示:
SELECT timestamp, price FROM PRICES
WHERE timestamp > 1504703321
AND timestamp < 1504707321
AND exchange = (SELECT exid FROM EXCHANGES WHERE name = "exchange_name")
AND market = (SELECT mid FROM MARKETS WHERE name = "market_name")
AND side = (SELECT sid FROM SIDES WHERE name = "ASK")
AND id % 2 = 0
ORDER BY timestamp ASC";
应该非常简单。为了使这篇文章简短,我不会写下有关其他表的更多信息。如果您需要更多信息,请随时询问,我会添加它。
如您所见,我使用“标准”mod 方法 ( AND id % 2 = 0
) 来获取每隔一行。但是,我遇到了一个问题:
用数据填充表的程序总是以相同的顺序添加新数据。假设我有两个交换机,名为 A
与 exid 1
和B
与 exid 2
。首先,一行 A
添加,然后添加一行 B
,然后是 A
的一行再次,然后B
一遍又一遍,依此类推。
结果将是:
id exchange ...
1 1 ...
2 2 ...
3 1 ...
4 2 ...
对于每个id % 2
哪里exchange = 1
结果始终是 != 0
,这意味着上述查询的结果将为空。
如果可能的话,我想仅通过修改SQL语句来解决这个问题,这意味着数据库/表和软件保持不变,并尽可能少地损失性能。该表最多可容纳 400 万行。
有办法实现吗?
最佳答案
使用子查询并添加新列:
SELECT timestamp, price
FROM (SELECT p.timestamp, p.price, (@rn := @rn + 1) as rn
FROM PRICES p CROSS JOIN
(SELECT @rn := 0) params
WHERE timestamp > 1504703321 AND
timestamp < 1504707321 AND
exchange = (SELECT exid FROM EXCHANGES WHERE name = 'exchange_name') AND
market = (SELECT mid FROM MARKETS WHERE name = 'market_name') AND
side = (SELECT sid FROM SIDES WHERE name = 'ASK')
) p
WHERE rn % 2 = 0
ORDER BY timestamp ASC;
关于mysql - 如何在不使用标准 mod 方法的情况下返回每第 n 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46077834/
我是一名优秀的程序员,十分优秀!