我有 1000 多行 SQL 数据,如下所示
umeta_id | user_id | meta_key | meta_value
433369 | 44 | all_contests | a:1:{s:12:"all_contests";a:2:{i:5011;a:1:{s:7:"entries";i:3;}i:8722;a:1:{s:7:"entries";i:3;}}}
433368 | 63 | all_contests | a:1:{s:12:"all_contests";a:2:{i:5032;a:1:{s:7:"entries";i:3;}i:8724;a:1:{s:7:"entries";i:3;}}}
当你反序列化其中一个值时,你会得到一个如下所示的数组:
Array
(
[all_contests] => Array
(
[5011] => Array
(
[entries] => 3
)
[8722] => Array
(
[entries] => 3
)
)
)
我正在尝试为给定的比赛 ID 从所有用户中创建一个排行榜。 “all_contests”键包含一个数组,该数组由用户注册的所有比赛的 ID 键控。里面是给定比赛的参赛作品。
查询需要查看包含“all_contests”键的所有行,并找到给定比赛 ID 的 10 个最高条目值。
我什至不确定是否可以按照我希望的方式可靠地在一段序列化数据中进行搜索。
最佳答案
不,在一段序列化数据中搜索是不切实际的。
您可以通过充分细致地使用 MySQL String Functions 来做到这一点如 INSTR()
、SUBSTR()
、FIELD()
等。但是像这样编写查询对于开发查询来说非常耗时,而且性能也不佳。
您正在做的是一个常见错误的变体:将逗号分隔的列表存储在一个表的列中。
这避免了创建交集表来表示多对多关系。换句话说,您有两个用于用户和比赛的表格,您需要第三个表格,其中每一行代表一个用户参加一个比赛。
请参阅我对 Is storing a delimited list in a database column really that bad? 的回答 答案是关于逗号分隔的列表,但它同样适用于序列化数组,就像您正在做的那样。
关于php - 查询序列化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38964671/