PHP构造SQL查询如何获取列唯一值并以逗号拼接返回
解决方案
你遇到的语法报错和返回结果不符合预期的问题,核心原因有两个:
- 你的查询里其他字段全是
SUM()/AVG()类聚合函数,单独写DISTINCT traffic_type属于非聚合字段,既没有放在GROUP BY子句里,也没有套聚合函数,本身就不符合SQL语法规则,和返回值类型是不是数组没关系。 - 原来的
SUM(DISTINCT traffic_type)逻辑是对去重后的traffic_type值做算术求和,自然拿不到你要的逗号分隔值列表。
直接用MySQL内置的GROUP_CONCAT()聚合函数就能实现需求,这个函数会把聚合范围内的字段值按指定分隔符拼接成单个字符串返回,搭配DISTINCT关键字就能自动去重,输出格式完全匹配你要的0,2效果。
修改后的代码
把原来select数组里的traffic_type对应行替换即可,其他逻辑不需要改动:
$statistic_query = array( 'select' => array( 'SUM(installs) AS installs_count', 'SUM(fake_installs) AS fake_installs_count', 'SUM(searchs) AS searchs_count', 'SUM(clicks) AS clicks_count', 'AVG(bid) AS bid_avg', 'SUM(user_profit) AS user_profit_sum', 'SUM(system_profit) AS system_profit_sum', 'SUM(visits) AS visits_count', 'SUM(downloads) AS downloads_count', 'GROUP_CONCAT(DISTINCT traffic_type SEPARATOR ",") AS traffic_type_list' ), 'from' => 'statistic' );
补充说明
GROUP_CONCAT()默认的分隔符就是逗号,SEPARATOR ","参数可以省略,显式写出来是为了让代码逻辑更直观。- 如果你的表中traffic_type唯一值非常多,要注意MySQL默认的
group_concat_max_len配置(默认值通常为1024字节),超过长度的内容会被自动截断。如果遇到截断问题,可以在执行这个统计查询前,先运行SET SESSION group_concat_max_len = 102400;临时调大当前连接会话的长度上限即可。 - 查询返回的结果中,
traffic_type_list字段就是标准的字符串格式,直接读取单条结果的该字段值就能用,不会返回数组结构。
内容的提问来源于stack exchange,提问作者Regular User
相关产品推荐
相关产品推荐

