You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 5.7中如何从JSON类型字段筛选指定id的去重值?

提取JSON字段中指定Key的去重值(MySQL 5.7 + PHP 7)

嘿,刚好MySQL 5.7已经支持足够的JSON函数来处理这个需求,我给你两种实用的方案:

基础方案:直接提取并去重

假设你的表名为fruit_data,JSON字段名为fruit_map,可以用->>操作符(这是JSON_UNQUOTE(JSON_EXTRACT())的简写,能直接取出无引号的字符串值)配合DISTINCT来实现:

SELECT DISTINCT fruit_map->>'$.74' AS unique_74_value
FROM fruit_data;

效果说明

这个语句会遍历所有行,提取每行JSON中74对应的value,然后自动去重。针对你给出的两行数据,结果只会返回Kiwi(因为两行的74值都是它),如果后续有其他不同的74值,也会被唯一列出。

进阶方案:过滤掉无指定Key的行

如果你的表中可能存在没有74这个Key的JSON数据,不想返回NULL值的话,可以加上JSON_CONTAINS_PATH条件过滤:

SELECT DISTINCT fruit_map->>'$.74' AS unique_74_value
FROM fruit_data
WHERE JSON_CONTAINS_PATH(fruit_map, 'one', '$.74');

参数解释

  • 'one'表示只要JSON中存在至少一个指定路径(这里就是$.74)就匹配,避免取出那些没有74键的行的NULL值。

PHP 7中调用示例(PDO版本)

如果你需要在PHP中获取这个结果,可以用PDO来执行SQL并处理返回值:

<?php
// 数据库连接信息
$dbHost = '你的数据库地址';
$dbName = '你的数据库名';
$dbUser = '用户名';
$dbPass = '密码';

try {
    // 初始化PDO连接
    $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 执行SQL
    $sql = "SELECT DISTINCT fruit_map->>'$.74' AS unique_74_value FROM fruit_data";
    $stmt = $pdo->query($sql);

    // 获取所有去重后的结果,返回一维数组
    $uniqueValues = $stmt->fetchAll(PDO::FETCH_COLUMN);
    
    // 输出结果
    print_r($uniqueValues);
} catch (PDOException $e) {
    die("数据库操作失败: " . $e->getMessage());
}

// 关闭连接
$pdo = null;
?>

内容的提问来源于stack exchange,提问作者Peter Karlsson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:23:07