【问题标题】:Mysql: get all distinct values from field serialized by PHPMysql:从PHP序列化的字段中获取所有不同的值
【发布时间】:2015-07-01 01:44:27
【问题描述】:

我有一个 movies 表(具有来自旧项目的数据),其中字段 genre 包含由 PHP 序列化的值,例如:

a:3:{i:0;s:9:"动画";i:1;s:9:"冒险";i:2;s:5:"戏剧";}

我正在一个搜索页面中工作,我需要找到当前搜索结果的所有独特类型以用作页面中的过滤器,

例如,如果搜索结果是这 2 部电影:

  • 黑暗骑士(动作、犯罪、戏剧)
  • 黑骑士(奇幻、冒险、喜剧)

我想知道这些流派的组合,这将是:

['action', 'crime', 'drama', 'fantasy', 'adventure', 'comedy']

如何获取流派数组? (我使用的是Yii2)。

【问题讨论】:

  • 反序列化、合并、array_unique
  • 它不会成为大型结果的性能杀手吗?
  • 如果你关心性能,你会规范你的数据库
  • ....或对旧数据进行一次性转换....
  • 您选择不修复损坏的数据库设计,每个操作都会比您选择修复它时慢;不要抱怨我们的解决方案速度很慢——您决定继续使用糟糕的数据库设计

标签: php mysql serialization yii2


【解决方案1】:

你应该unserialize你的数据

$data = 'a:3:{i:0;s:9:"Animation";i:1;s:9:"Adventure";i:2;s:5:"Drama";}';
$data = unserialize($data);
print_r($data);

你会得到

Array
(
    [0] => Animation
    [1] => Adventure
    [2] => Drama
)

如果您需要在整个表格中搜索“戏剧”来决定显示哪些节目/电影,您可以随时在搜索中使用通配符

select * from table where column like '%Drama%'

但当然要确保采取适当的数据库预防措施。

【讨论】:

  • 但我认为获取所有结果并循环它们以进行反序列化将是一个糟糕的性能打击!特别是有很大的结果。
  • 我现在没有总行数,但它应该是类似 imdb 之类的东西,& 处理将取决于用户的搜索条件。
  • 但是每次搜索会有多少结果呢?在您的示例中,您有 2 - Dark Knight 和 Black Knight 的记录。对于这个数量(或十倍),在 php.ini 中执行它可能不会有什么坏处。但是如果你想要一个查询,比如“有多少电影被标记为‘奇幻’、‘冒险’和‘喜剧’,那就太麻烦了。
  • @VolkerK 不幸的是,用户可以按流派搜索
  • 然后进行转换或忍受性能影响( LIKE %xyz% -> 没有索引会有所帮助 -> 您可以使用平面文件而不是数据库)。如果你在你的 php 应用程序中正确地解耦了实际的搜索机制,你可以在将来的任何时候进行切换(如果当前布局伤害太大)。
【解决方案2】:

假设您有一个序列化字符串,该字符串在不同位置具有各种值,并且您需要从序列化字段中进行搜索。您需要使用 MySQL 查询的特定键的值。使用 MySQL 的“%like%”语句非常容易,但“%like%”会获取更多您不需要的匹配项。 从序列化字段搜索:假设您在数据库中有以下序列化字符串:

a:9:{s:2:"m1";s:4:"1217";s:2:"m2";s:8:"9986-961";s:2:"m3";s:19:"1988-03-07 00:00:00";s:2:"m4";s:0:"";s:2:"m5";s:0:"";s:2:"m6";s:0:"";s:2:"m7";s:3:"104";s:2:"m8";s:6:"150000";s :2:"m9";s:18:"Ok Then, Yes It Is";}

你需要 m9 值为“Yes It Is”的行。

所以 sql 会是这样的:

SELECT * FROM table WHERE field REGEXP '.*"array_key";s:[0-9]+:".array_value.".*'

测试代码

SELECT * FROM table WHERE field REGEXP '.*"m9";s:[0-9]+:".Ok Then, Yes It Is.".*'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-09
    • 2014-01-14
    • 2015-05-09
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多