【问题标题】:Search Json array inside a col with php sql query使用 php sql 查询在 col 中搜索 Json 数组
【发布时间】:2018-04-30 10:50:53
【问题描述】:

我需要一些帮助。

目前我的 mariadb 设置为一列作为 json 数组。

我想从用户输入中搜索数组,然后将其与存储在数据库中的用户的名字和姓氏结合起来。

在数据库中:

列:名字、姓氏和郊区_i_cover(包含json数组)

例如:[“比勒陀利亚”、“开普敦”、“花园大道”]

我想要一个 sql 语句,它会搜索郊区_i_cover 并允许我组合名字和姓氏。

到目前为止,我有这个:

<?php

//echo JUri::getInstance();

if (isset($_GET['category'])) {
$catetogry = $_GET['category'];
$name = $_GET['name'];

$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query = ("SELECT * FROM #__jsn_users"); //not sure what goes here

$db->setQuery($query);
$results = $db->loadObjectList();


foreach($results as $obj) {

    $value = json_decode($obj->suburbs_i_cover);

    $value = array_filter($value, 'strlen');  //removes null values 
but leaves "0"
    $value = array_filter($value);            //removes all null 
values

    if (!empty($value)) {

    $value2 = $obj->firstname;
    $value3 = $obj->lastname;

    echo $value2 . ' '. $value3;
    //echo "<br>";
   // echo sizeof($value);
    echo "<br>";
    if (is_array($value)) {
        foreach ($value as $sub_value) {
            echo $sub_value;
            echo "<br>";
        }
    }

        echo "<br>";
        echo "<hr>";

} 

}
} 

【问题讨论】:

  • 在数据库中存储 JSON(或其他数据格式)通常表明您的数据模型不是很好。数据未标准化,这意味着像这样的操作和索引操作既困难又昂贵。
  • @Utkanos 不幸的是,我必须使用当前设置。 :(
  • 您使用的是什么版本的 MySQL。我问 MySQL 5.7+ 有 JSON 数据类型。您使用的是 JSON 数据类型吗?
  • “这意味着像这样的操作和索引,既困难又昂贵。” @Utkanos PostgreSQL 等一些数据库允许对直接 JSON 数据 (JSONB) 进行良好和快速的索引。 MySQL 还允许在 JSON 上建立索引,但在生成的列上与普通索引一样快。JSON (NoSQL) 将在数据库中得到适当的开发,考虑 MySQL 8.0,它是一个 SQL 和 NoSQL 数据库。

标签: php json mariadb


【解决方案1】:

我有一个可行的解决方案:

使用:in_array($name, $value)

<?php

//echo JUri::getInstance();

if (isset($_GET['category'])) {
$catetogry = $_GET['category'];
$name = $_GET['name'];

$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query = ("SELECT * FROM #__jsn_users");
$db->setQuery($query);
$results = $db->loadObjectList();


foreach($results as $obj) {

    $value = json_decode($obj->suburbs_i_cover);

    $value = array_filter($value, 'strlen');  //removes null values 
but leaves "0"
    $value = array_filter($value);            //removes all null 
values

    if (in_array($name, $value)) {

        $value2 = $obj->firstname;
        $value3 = $obj->lastname;

        echo $value2 . ' '. $value3;


        echo "<br>";
        echo "<hr>";


    }

}
}


?>

【讨论】:

  • 选择所有记录(select * from .. 部分)可能是一种浪费。你可以通过select * from tablename where json_colum rlike 'searchword' 或类似的方法来减少它。强烈建议复习基本的 SQL 语句...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
相关资源
最近更新 更多