我有表名log_requests
,我将json数组存储到request
列中,如下所示
{"game_id":"1","score":"820",}
game_ids是1到20,现在我想知道多次使用哪个game_id。为了获得一个game_id的计数,我正在使用下面的查询,它运行正常
SELECT * FROM log_requests WHERE json_contains(request, '{"game_id" : "1"}')
但是如何从此表中获得前5个game_id?
“我用脚开枪,如何制造拐杖?”
句号。
创建一个明智的表结构,将游戏存储在单独的表中,使用简单的常规SQL获取数据,您永远不会遇到这样的问题
select game_id, count(1) cnt from games group by game_id order by cnt desc limit 5
正如您的常识所说,它不是最佳方法,但是您可以通过制作一个临时表来解决此问题。
类似这样的东西:
CREATE TEMPORARY TABLE
temp_log_requests
SELECT
JSON_EXTRACT(request, '$.game_id') AS game_id,
... -- Include the columns you want to use from log_requests here
FROM
log_requests
LIMIT 0;
然后您可以在同一会话中像查询其他任何表一样查询临时表。
参见:https://dev.mysql.com/doc/refman/8.0/en/create-temporary-table.html
我也有查询方面的经验,并认为每次获得1到20个game_id都很容易。像这个查询:对于(int i = 0; i <20; i ++)从log_requests中选择COUNT(*),其中json_contains(request,'{“ game_id”:“ i”}')并使用您的编程语言的功能对变量进行排序。
Query:“ SELECT *”将在运行查询中花费大量执行时间,因此您应该使用“ SELECT COUNT(*)”