php - 查询序列化数据

标签 php mysql sql serialization

我有 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/

相关文章:

php - 如何将 gzip 内容作为 PHP 响应发送

php - 无法通过PHP连接MYSQL,但可以通过phpMyAdmin使用

php - 在空白窗口中打开数据库提供的链接

php - htaccess 不在 codeigniter 中重定向

mysql - 根据ID选择2个表之间的同一行

Php MySQL 更新一个字段并等待 12 小时

sql - 更新还是插入和删除?对于大文本列,哪个更适合存储/性能?

java - 无法将 Java 程序链接到 SQL 数据库

sql - SQL Server 2008 中的 ISNULL 函数无法正常工作

php - 使用应用程序代码强制执行 NOT NULL 是错误的吗?