关于mysql查询的单个字段值不同的重复数据进行合并解决方法
先列出解决方案sql
SELECT v1.*, group_concat( device.partner_name ) AS partner_name, group_concat( device.partner_mode ) AS partner_mode, IF ( device.partner_name IS NULL OR device.partner_name = '', '', v1.eps_multiple_payments_value1 ) AS eps_multiple_payments_value FROM ( SELECT id, created_at, eps_multiple_payments, ( CASE eps_multiple_payments WHEN '0' THEN '全部' WHEN '1' THEN '启用' WHEN '2' THEN '禁用' ELSE '--' END ) AS `eps_multiple_payments_value1` FROM gas_station ) AS v1 LEFT JOIN is_gas.gas_station_cashier_device_supplier device ON v1.id = device.station_id GROUP BY v1.id ORDER BY v1.created_at DESC
这条sql解决了两个问题:
1、v1单表查询的时候数据有1975条,连表后有1979条,有4条数据除了次表的partner_name和partner_mode字段其他字段都是一样的,是一对多的关系。
下图修改为上图:
要求吧重复的数据合并,partner_name和partner_mode按照逗号拼接放到一起。这里是使用GROUP BY v1.id 根据主表的id进行分组, 然后使用group_concat( device.partner_name ) AS partner_name, group_concat( device.partner_mode ) AS partner_mode 函数进行拼接
group_concat函数:
将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
group_concat函数首先根据group by指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔。
group_concat函数
2.需要实现当partner_name有值的时候,才能给eps_multiple_payments_value1赋值,因为eps_multiple_payments_value1是镶嵌在内部表的字段,然而先要判断的是外层表的partner_name字段。
下图修改为上图:
这个把镶嵌表的字段名改一下,到外层重新进行判断赋值,再更换命名就行了,1.重命名( CASE eps_multiple_payments WHEN '0' THEN '全部' WHEN '1' THEN '启用' WHEN '2' THEN '禁用' ELSE '--' END ) AS `eps_multiple_payments_value1` 2.判空 再赋值,并重命名 IF( device.partner_name IS NULL OR device.partner_name = '', '', v1.eps_multiple_payments_value1 ) AS eps_multiple_payments_value
IF函数:
IF函数根据判断条件是否成立进行选择执行,成立时执行一条语句,不成立时执行另一条语句
if (条件, value_if_true, value_if_false)
IF函数
case函数:
( CASE eps_multiple_payments WHEN '0' THEN '全部' WHEN '1' THEN '启用' WHEN '2' THEN '禁用' ELSE '--' END ) AS `eps_multiple_payments_value1` 或者 ( CASE WHEN 英语成绩 > 60 THEN '运气罢了~' WHEN 英语成绩 = 60 THEN '大难不死' WHEN 英语成绩 < 60 THEN '你!已经死了!!!' ELSE '逃课是吧,你完了!' END ) AS `英语考试结果`