mysql查询在包含json数组的列内搜索

时间:2015-01-09 14:09:47

标签: php mysql sql json

我在这个格式的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([^"]*)"';

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

它远没有效率,我不鼓励你使用这个片段,但这里有你想要的东西。

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来执行此操作。我无法理解。感谢