【问题标题】:check if a value exists in json encode array in mysql检查mysql中的json编码数组中是否存在值
【发布时间】:2017-04-29 04:47:29
【问题描述】:

我正在开发一个 Mysql 触发器以在我的数据库上执行某些操作。在做任何事情之前,我想检查我的配置表中的 json_encode 字符串中是否存在一个值,然后继续运行触发器。 我的配置表由 php 脚本处理,如下所示:

-------------------------------------------
| config_name | config_value              |
-------------------------------------------
| target_id   | ["1","16","18","22","37"] |
-------------------------------------------

在 php 中我们可以使用: 如果 in_array(json_decode(config_value)) 和 ...

但我的问题在于不支持 in_array 和 json_decode 的 Mysql 语法

如何检查我的值是否存在于 Mysql 触发器的“配置值”中?

【问题讨论】:

    标签: php mysql json


    【解决方案1】:

    如何解决这个问题

    如果您将 JSON 存储在 mysql 中,请确保升级到 mysql 5.7,然后您可以使用可用的JSON functions 范围。在您的特定情况下,您可以这样做

       SELECT * FROM my_table WHERE JSON_SEARCH(config_value,"one", "17") IS NOT NULL;
    

    你绝对应该做的事情

    您的数据有问题。如果你发现你总是在搜索一个 JSON 字段,那真正意味着你的表应该被规范化。

    更新:第 2 节,标题已按照 @Sammitch 的建议更改

    【讨论】:

    • 更像是“你绝对应该做的事情”。
    • 好的 @Sammitch 现在正在改变 :-)
    • 得到了我的投票,从来不知道这一点,并将在一些客户项目中使用它!干杯:-)
    • 很高兴@Darren 感谢您的投票
    【解决方案2】:

    感谢您的回复。但不幸的是mysql版本是5.1,无法升级。实际上,我正在向 voipswitch 系统添加一些功能。所以我的灵活性仅限于目前的功能。

    我正在选择多个资费,并且我想记录插入的呼叫(在通过我的触发器在“呼叫”表中插入呼叫之后)属于列表中所选资费的某些分析。

    我还尝试了 php 序列化函数而不是 json_encode 来将我的关税 ID 存储在配置表中。但是mysql也不支持反序列化。

    【讨论】:

    • 你应该回复某人的评论说这是问题所在,而不是回答问题陈述。
    • 您可以尝试使用mysql函数INSTRFIND_IN_SET检查值。尝试使用这些功能,您可能会找到解决方案。您可以使用INSTR,首先检查,"17", 的值,然后检查"17",,然后检查,"17"。看看那些,我添加了双引号,所以这将准确搜索您正在寻找的内容。第一个表示您要查找的数字在中间,第二个表示开始,第三个表示结束。试着去理解。
    【解决方案3】:

    使用这个:

    @Query(value = "select * from configs where json_contains(config_value, json_array(?1))))", nativeQuery = true)
    List<Config> list(String config);
    

    【讨论】:

      【解决方案4】:

      好的,所以你有一个JSON_ARRAY() 来检查JSON_ARRAY() 中是否存在特定的ID,只需输入一个条件,即JSON_CONTAINS(config_value,"1")=1,所以如果你的JSON_ARRAY() 中存在“1”,那么它将返回 1,否则返回 0。

      另外,在执行插入/更新查询时,您可以使用"..config_value=JSON_ARRAY(" . implode(',', $arr) . ") ...

      ,而不是在 PHP 代码中执行 json_encode

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-28
        • 1970-01-01
        相关资源
        最近更新 更多