使用 JSON 数据对 SQL 行进行数学排序
Sort SQL Rows with math using JSON data
假设我有一个这样的 MySQL 数据库(赞成票和反对票是 JSON 用户 ID 数组),id 是一个自动递增的整数,内容是文本)
id upvotes downvotes content
--- ------------------- ------------ --------------
1 [1, 5, 15] [1] some text
10 [1, 100, 25] [3, 9] other stuff
17 [5, 10, 1110] [5, 6, 7, 8] also includes
36 [5, 6, 7, 8, 9] [] metadata stuff
37 [5, 6, 8, 10, 1, 7] [4] equal count to 36
我想按赞成票数减去反对票数对返回的行进行排序,然后在相等时按 ID 排序,因此 ID 的顺序为 36, 37, 1, 10, 17
。这在 PHP 中可行吗?如何实现?
(这个问题是 的转贴,因为它通过计算数组而不是简单地从行中获取数字来工作。)
MySQL 没有本地 JSON 支持,尽管它似乎即将到来。因此,您必须将这些值视为字符串。基本上,您想计算每个字符串中元素的数量并按差异排序。
你可以通过计算逗号来做到这一点:
order by (length(upvotes) - length(replace(upvotes, ',', '')) ) -
(length(downvotes) - length(replace(downvotes, ',', '')) )
注意:如果您要维护每个可能投票的字符串,也许您还应该在记录中包含一个计数器。
假设我有一个这样的 MySQL 数据库(赞成票和反对票是 JSON 用户 ID 数组),id 是一个自动递增的整数,内容是文本)
id upvotes downvotes content
--- ------------------- ------------ --------------
1 [1, 5, 15] [1] some text
10 [1, 100, 25] [3, 9] other stuff
17 [5, 10, 1110] [5, 6, 7, 8] also includes
36 [5, 6, 7, 8, 9] [] metadata stuff
37 [5, 6, 8, 10, 1, 7] [4] equal count to 36
我想按赞成票数减去反对票数对返回的行进行排序,然后在相等时按 ID 排序,因此 ID 的顺序为 36, 37, 1, 10, 17
。这在 PHP 中可行吗?如何实现?
(这个问题是 的转贴,因为它通过计算数组而不是简单地从行中获取数字来工作。)
MySQL 没有本地 JSON 支持,尽管它似乎即将到来。因此,您必须将这些值视为字符串。基本上,您想计算每个字符串中元素的数量并按差异排序。
你可以通过计算逗号来做到这一点:
order by (length(upvotes) - length(replace(upvotes, ',', '')) ) -
(length(downvotes) - length(replace(downvotes, ',', '')) )
注意:如果您要维护每个可能投票的字符串,也许您还应该在记录中包含一个计数器。