【问题标题】:Use JSON array in MYSQL WHERE clause在 MYSQL WHERE 子句中使用 JSON 数组
【发布时间】:2020-09-23 11:50:15
【问题描述】:

谁能帮助我正确的语法。我有一个产品代码的 JSON 数组,并希望将其传递给 mysql 以搜索每个 ID

["3300-0021-PC","PRIMA802","3633-6021\/4","3652-5023\/3","3652-5021\/3","3652-5022\/3","3652-5024\/3"]

我的 sql 查询

SELECT
p.id,
p.name FROM
p_product p WHERE
p.name IN ('3633-0002', '3633-0052')
AND p.deleted = 0

我想在 WHERE 子句中使用 JSON 数组。我可以更改字符串以使其工作,但如果有更有效/正确的方法来使用 JSON_EXTRACT 之类的 JSON 数组,我会徘徊。我正在使用 MYSQL 5.7。我看过mysql json where clause,但我的数组不是宾格数组,谢谢。

我已经尝试在我的代码中使用这种方法,如下所示

public function productsArray($api, $args) 
{
    $test = array("3300-0021-PC","PRIMA802","3633-6021/4","3652-5023/3","3652-5021/3");
    $test = json_encode($test);

    $db         = $GLOBALS['db']->getConnection();
    $result     = [];
    $rowData    = [];

    $query .= "SELECT
        p.id,
        p.name
    FROM
        p_product p
    WHERE
        JSON_SEARCH(".$test.", 'one', p.name) IS NOT NULL
        AND p.deleted = ?";

    $stmt = $db->executeQuery($query, array(0));

    if ($stmt->rowCount() > 0) {
        foreach($stmt->fetchAll() as $row) {
            foreach ($row as $key => $val) {
                $rowData[$key] = $val;
            }
            $result['records'][] = $rowData;
        }
        $result['Total'] = $stmt->rowCount();
        return $result;
    }
    return false;
}

这是抛出一个 SQL 错误,在查询中使用它之前是否必须设置一个 json 数组?

【问题讨论】:

  • @Akina,谢谢你,'one' 是否告诉 sql 从数组的开头开始?

标签: mysql arrays json


【解决方案1】:
SELECT *
FROM p_product p
WHERE JSON_SEARCH(@j, 'one', p.name) IS NOT NULL;

fiddle


'one' 是否告诉 sql 从数组的开头开始?

'one' 的意思是“找到第一个出现”——这对你的任务来说已经足够了。

【讨论】:

  • 我试图实现你的方法,但是它抛出了一个 sql 错误我需要在使用它之前设置一个 json 数组吗?
  • @John @j 是一个占位符。您可以将用户定义或局部变量与您的 JSON、某个表的列或插入包含您的 JSON 的字符串文字(直接通过替换或作为准备好的语句参数)代替 - 这是您的选择。
  • @Aklina,感谢您的回复,我认为这将是一个占位符,只是奇怪当我将其作为字符串放入时出现错误,将其作为准备好的变量尝试
  • @John 显示最终查询文本(替换后)和错误消息(未更改且未缩短)。
【解决方案2】:

现在所有工作都通过准备好的语句传递 json 数组

    public function productsArray($api, $args) 
{
    $test = array("3300-0021-PC","PRIMA802","3633-6021/4","3652-5023/3","3652-5021/3");

    $db         = $GLOBALS['db']->getConnection();
    $result     = [];
    $rowData    = [];

    $query .= "SELECT
        p.id,
        p.name
    FROM
        p_product p
    WHERE
        JSON_SEARCH(?, 'one', p.name) IS NOT NULL
        AND p.deleted = ?";

    $stmt = $db->executeQuery($query, array(json_encode($test), 0));

    if ($stmt->rowCount() > 0) {
        foreach($stmt->fetchAll() as $row) {
            foreach ($row as $key => $val) {
                $rowData[$key] = $val;
            }
            $result['records'][] = $rowData;
        }
        $result['Total'] = $stmt->rowCount();
        return $result;
    }
    return false;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多