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
相关产品推荐
相关产品推荐

