我在设置稍微高级一些的 SQL 查询时遇到了困难。
我想做的是为每个 zr_miner_id
选择最后 24 个条目,但我一直收到 SQL 超时(该表到目前为止有大约 40000 个条目)。
假设 zr_miner_id
1 有 200 个条目,zr_miner_id
2 有 200 个条目,我最终会得到 48 个结果。
到目前为止,我提出了以下查询。
这应该做的是选择 zec_results
中具有相同 zr_miner_id
的新条目少于 24 个的每个结果。
我想不出任何更好的方法来执行此任务,但话又说回来,我在 SQL 方面还没有那么先进。
SELECT results_a.*
FROM zec_results results_a
WHERE (
SELECT COUNT(results_b.zr_id)
FROM zec_results AS results_b
WHERE results_b.zr_miner_id = results_a.zr_miner_id
AND results_b.zr_id >= results_a.zr_id
) <= 24
最佳答案
使用变量!
SELECT r.*
FROM (SELECT r.*,
(@rn := if(@m = r.zr_miner_id, @rn + 1,
if(@m := r.zr_miner_id, 1, 1)
)
) as rn
FROM zec_results r CROSS JOIN
(SELECT @m := -1, @rn := 0) params
ORDER BY r.zr_miner_id, r.zr_id DESC
) r
WHERE rn <= 24 ;
如果你想把查询放到一个 View 中,那么上面的方法就不行了。您的方法的性能可能会随着 (zr_miner_id, zr_id)
上的索引而提高。
关于mysql - 为某个非主字段选择最后 X 个条目的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45387388/