PHP查询在表中查找Json值

时间:2015-08-10 12:25:04

标签: php mysql json

我想知道我是否可以用普通的PHP实现以下目标:

我想根据json字符串中的值检索数据库中的行。字符串如下所示:

{
   "ext":{
      "pdf":3
   },
   "count":3
}

我想检索PDF等于4的所有行。

这是否可以在PHP中使用?进行查询并仅搜索Json值。像这样:

SELECT id FROM table WHERE ext->pdf = 4

我试图自己搜索它只是我不断得到讨论编码查询结果的网页结果给Json而不是我想要实现的目标。

2 个答案:

答案 0 :(得分:1)

不,这是不可能的。关系数据库中的Json数据不会被数据库引擎解析。

编辑:阅读有关此功能的最新支持的评论贡献

您可以自由地将json存储到db中,但是您接受这样做,放弃使用json数据,就好像存储在db的列中一样,作为其他关系数据库数据。通常只有在知道根本不需要根据json结构中包含的某些数据进行搜索或更新时才将json数据存储在db中,并且json数据不需要像“普通”列中存储的数据那样更新查询

你可以:

1 - 使用db表的另一列来存储pdf值(或任何其他可能与查询相关的json数据)并在查询中使用它,确保pdf列及其相对json始终同步;

2 - 使用db native string或regexp函数手动解析json字符串,但这对于大型表或大型json来说非常昂贵。这可能会使您的查询时间非常大;

3 - 使用非关系数据库,如mongoDb,如果您需要经常执行此类任务,则可以以不同方式存储数据

答案 1 :(得分:1)

If I understand your question correctly then you already know the ext i.e. it is going to be "pdf" every time. Considering that you can build your query as follows:

$json = '{
   "ext":{
      "pdf":3
   },
   "count":3
}';

$data = json_decode($json);

SELECT id FROM table WHERE pdf = $data['ext']['pdf'];

eg. SELECT id FROM table WHERE pdf = 3;

If you are not sure of the extension then you can try something as follows:

$where = '';
foreach ($data['ext'] as $ext => $value)
{
    $where .= ' ' . $ext . ' = ' . $value . ' OR';
}

$where = rtrim($where, 'OR');

$query = 'SELECT id FROM table WHERE] . $where;

decoding your json to Array is not necessary, but that's just my way of doing it.