我想知道我是否可以用普通的PHP实现以下目标:
我想根据json字符串中的值检索数据库中的行。字符串如下所示:
{
"ext":{
"pdf":3
},
"count":3
}
我想检索PDF等于4的所有行。
这是否可以在PHP中使用?进行查询并仅搜索Json值。像这样:
SELECT id FROM table WHERE ext->pdf = 4
我试图自己搜索它只是我不断得到讨论编码查询结果的网页结果给Json而不是我想要实现的目标。
答案 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.