【问题标题】:mysql query to search inside column containing json arraymysql查询在包含json数组的列内搜索
【发布时间】:2015-01-09 14:09:46
【问题描述】:

我在 MySQL 数据库中有一个这样格式的列:

{
"monday":[["11:00","19:30"]],
"tuesday":[["11:00","19:30"]],
"wednesday":[["11:00","19:30"]],
"thursday":[["11:00","19:30"]],
"friday":[["11:00","20:00"]],
"saturday":[["11:00","20:00"]],
"sunday":[["11:00","20:00"]]
}

假设我想知道餐厅现在是否营业,即星期五 14:00

如何进行此查询?有什么办法吗?

我试过这个查询

SELECT id FROM table_name WHERE field_name REGEXP '"key_name":"([^"]*)key_word([^"]*)"';

但我想先搜索一天,然后再搜索几个小时之间。我无法弄清楚如何解决它。

【问题讨论】:

  • 这就是你不将数据存储为 json 的原因
  • 可以使用 MySQL 的 REGEXP 搜索数据:dev.mysql.com/doc/refman/5.1/en/regexp.html
  • 约翰是什么意思?我从外部来源获得了这些数据。
  • 谢谢你,Karl.. 我知道这一点.. 但我无法创建查询
  • 如果您知道这一点,那么您肯定已经尝试过,您尝试过什么?

标签: php mysql sql json


【解决方案1】:

不幸的是,无法使用选择查询来搜索该类型的数据。使用适当的列类型重构数据库会快得多。如果您坚持要保持当前的数据库布局,则需要编写一个 sql 函数,以便正确解析数据并返回所需的内容。

【讨论】:

  • 错误:您可以使用 REGEXP 来执行此操作。
【解决方案2】:

它远没有效率,我不鼓励你使用这个 sn-p,但这里有一些东西可以做你想做的事情。

select json
, openday
, start
, end
, opening
, startopen
, endopen
from (
    select json
    , openday
    , start
    , end
    , opening
    , left(opening, locate(',',opening) - 1) as startopen
    , right(opening, locate(',',opening) - 1) as endopen
    from (
        select json
        , openday
        , start
        , end
        , replace(substring(json, start, end - start), '"','') as opening
        from (
            select json
            , openday
            , locate('[[', json, openday) + 2 as start
            , locate(']]', json, openday) as end 
            from (
                select json
                , locate('friday', json) as openday
                from `test-regexp`
            ) as a
        ) as b
    ) as c
) as d
where '14:00' between startopen and endopen

我强烈建议使用其他方法来查询此类数据。许多语言已经具备原生解析 JSON 的功能。

@Karl 的注意事项:您如何使用 REGEXP 来做到这一点。我看不出怎么做。谢谢

【讨论】:

    猜你喜欢
    • 2019-07-23
    • 1970-01-01
    • 2018-04-24
    • 2021-01-21
    • 2016-12-05
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多