精华内容
下载资源
问答
  • mysql多条记录合并一行

    千次阅读 2019-01-12 16:47:46
    在某些情况下,我们需要把mysql查询出的多条记录合并一行,可以使用GROUP_CONCAT函数,把结果用指定分隔符拼接起来。 1.正常情况下: SELECT name from product_stock; 结果为: 2.现在需要把结果拼接到...

    在某些情况下,我们需要把mysql查询出的多条记录合并为一行,可以使用GROUP_CONCAT函数,把结果用指定分隔符拼接起来。

    1.正常情况下:

    SELECT name from product_stock;
    

    结果为:

    在这里插入图片描述

    2.现在需要把结果拼接到一行

    SELECT GROUP_CONCAT(name SEPARATOR ',') as name from product_stock;
    

    结果为:

    在这里插入图片描述

    我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=rarrla75ul59

    展开全文
  • 一个字段可能对应多条数据,用mysql实现将多行数据合并一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: 1 SELECT am.activeId,m.modelName 2 FROM activemodel am 3 JOIN ...

    mysql中将多行数据合并成一行数据

    一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据

    例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句:

    1 SELECT am.activeId,m.modelName
    2 FROM activemodel am
    3 JOIN model m
    4 ON am.modelId = m.modelId
    5 ORDER BY am.activeId
    查询出的列表为图1所示:
    在这里插入图片描述
    修改过后的sql语句,查询后如图2所示:

    1 SELECT am.activeId,GROUP_CONCAT(m.modelName SEPARATOR ‘,’) modelName
    2 FROM activemodel am
    3 JOIN model m
    4 ON am.modelId=m.modelId
    5 WHERE m.valid=1
    6 GROUP BY am.activeId

    需注意:

    1.GROUP_CONCAT()中的值为你要合并的数据的字段名;

    SEPARATOR 函数是用来分隔这些要合并的数据的;

    ’ '中是你要用哪个符号来分隔;

    2.必须要用GROUP BY 语句来进行分组管理,不然所有的数据都会被合并成一条记录,如图3
    在这里插入图片描述
    如有错误,欢迎指正!

    展开全文
  • 原创 : 我们在做项目中有时候会遇到这种需求需要将name 为张三的hobby合并为如下: 当然你也可以通过mysql的 group_comcat将hobby合并成一列,那个很简单,这里不做介绍先建表,插入数据SET NAMES utf8mb4; SET FOREIGN...

    原创 : 我们在做项目中有时候会遇到这种需求


    需要将name 为张三的hobby合并为如下: 


    当然你也可以通过mysql的 group_comcat将hobby合并成一列,那个很简单,这里不做介绍

    先建表,插入数据

    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for t_user
    -- ----------------------------
    DROP TABLE IF EXISTS `t_user`;
    CREATE TABLE `t_user`  (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `age` int(5) NULL DEFAULT NULL,
      `hobby` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Records of t_user
    -- ----------------------------
    INSERT INTO `t_user` VALUES (1, '张三', 18, '读书');
    INSERT INTO `t_user` VALUES (2, '张三', 18, '打游戏');
    INSERT INTO `t_user` VALUES (3, '张三', 18, '写代码');

    再编写SQL

    SELECT  
      GROUP_CONCAT(
        CONCAT(  
          '(select hobby from t_user where id = ',  
          id,  
          ') AS ',  
          CONCAT('hobby',id)
        )  
      ) INTO @sql  
    FROM t_user;
    SET @sql = CONCAT('select name,age, ', @sql, ' from t_user GROUP BY name');
    PREPARE stmt FROM @sql;  
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt; 

    上面的写法其实相当于

    select name,age,(select hobby from t_user where id = 1) as hobby1,(select hobby from t_user where id = 2) as hobby2,
    (select hobby from t_user where id = 3) as hobby3 from t_user GROUP BY name;

    执行结果



    以上是表中只有名为张三时的情况

    还有当表中存在多个用户时

    建表,插数据

    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for t_user
    -- ----------------------------
    DROP TABLE IF EXISTS `t_user`;
    CREATE TABLE `t_user`  (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `age` int(5) NULL DEFAULT NULL,
      `hobby` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Records of t_user
    -- ----------------------------
    INSERT INTO `t_user` VALUES (1, '张三', 18, '读书');
    INSERT INTO `t_user` VALUES (2, '张三', 18, '打游戏');
    INSERT INTO `t_user` VALUES (3, '张三', 18, '写代码');
    INSERT INTO `t_user` VALUES (4, '王五', 20, '吃饭');
    INSERT INTO `t_user` VALUES (5, '王五', 20, '睡觉');
    INSERT INTO `t_user` VALUES (6, '王五', 20, '打豆豆');
    
    


    因为如果要查询王五的hobby要从1开始,而Mysql不像Oracle有rownum,所以通过sql创建rownum

    -- 设置rownum
    SELECT @rownum:=@rownum+1 AS rownum, t_user.* 
    FROM (SELECT @rownum:=0) r, t_user where name='王五';

    然后再查询

    set @name = '王五';
    SELECT  
      GROUP_CONCAT(DISTINCT 
        CONCAT(  
          '(select hobby from (SELECT @rownum:=@rownum+1 AS rownum, t_user.* 
    FROM (SELECT @rownum:=0) r, t_user where name="',@name,'") t where t.rownum = ',  
          t.rownum,  
          ') AS ',  
          CONCAT('hobby',rownum)
        )  
      ) INTO @sql  
    FROM (SELECT @rownum:=@rownum+1 AS rownum, t_user.* 
    FROM (SELECT @rownum:=0) r, t_user where name=@name) t;
    SET @sql = CONCAT('select distinct name,age, ', @sql, ' from t_user where name ="',@name,'"');
    PREPARE stmt FROM @sql;  
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt; 

    执行结果


    分享完毕

    以下为转载:  Mysql 如何通过行列转化动态实现   https://blog.csdn.net/xeseo/article/details/24364921

    MYSQL下如何动态生成标题的数据透视表。


    先用以下script生成一张包含若干属性的表叫"properties"。

    [sql]  view plain  copy
    1. CREATE TABLE properties (  
    2.   id INT(11) NOT NULL AUTO_INCREMENT,  
    3.   item_id INT(11) DEFAULT NULL,  
    4.   property_name VARCHAR(255) DEFAULT NULL,  
    5.   value VARCHAR(255) DEFAULT NULL,  
    6.   PRIMARY KEY (id)  
    7. );  
    8. INSERT INTO properties VALUES   
    9.   (1, 1, 'color''blue'),  
    10.   (2, 1, 'size''large'),  
    11.   (3, 1, 'weight', 65),  
    12.   (4, 2, 'color''orange'),  
    13.   (5, 2, 'weight', 57),  
    14.   (6, 2, 'size''large'),  
    15.   (7, 3, 'size''small'),  
    16.   (8, 3, 'color''red'),  
    17.   (9, 3, 'weight', 12),  
    18.   (10, 4, 'color''violet'),  
    19.   (11, 4, 'size''medium'),  
    20.   (12, 4, 'weight', 34),  
    21.   (13, 5, 'color''green'),  
    22.   (14, 5, 'weight', 10);  

    然后我们想根据原始数据生成如下report。

    1. +----+---------+---------------+--------+
    2. | id | item_id | property_name | value |
    3. +----+---------+---------------+--------+
    4. | 1 | 1 | color | blue |
    5. | 2 | 1 | size | large |
    6. | 3 | 1 | weight | 65 |
    7. | 4 | 2 | color | orange |
    8. | 5 | 2 | weight | 57 |
    9. | 6 | 2 | size | large |
    10. | 7 | 3 | size | small |
    11. | 8 | 3 | color | red |
    12. | 9 | 3 | weight | 12 |
    13. | 10 | 4 | color | violet |
    14. | 11 | 4 | size | medium |
    15. | 12 | 4 | weight | 34 |
    16. | 13 | 5 | color | green |
    17. | 14 | 5 | weight | 10 |
    18. +----+---------+---------------+--------+
    =>
    1. +---------+--------+--------+--------+
    2. | item_id | color | size | weight |
    3. +---------+--------+--------+--------+
    4. | 1 | blue | large | 65 |
    5. | 2 | orange | large | 57 |
    6. | 3 | red | small | 12 |
    7. | 4 | violet | medium | 34 |
    8. | 5 | green | NULL | 10 |
    9. +---------+--------+--------+--------+

    众所周知,MySql里并没有自动表转换的功能。当然,我们可以用一些额外的程序或工具来连接MySQL去执行数据转换。但在这里,我们来探讨下如何手动的写一个查询来实现数据转换。该查询可以这样实现:


    [sql]  view plain  copy
    1. SELECT  
    2.   item_id,  
    3.   MAX(case when property_name = 'color' then VALUE else NULL END) AS color,  
    4.   MAX(CASE property_name WHEN 'weight' THEN value ELSE null END) AS weight,  
    5.   MAX(IF(property_name = 'size', value, NULL)) AS size,  
    6.   ...  
    7.   ...  
    8. FROM  
    9.   properties  
    10. GROUP BY  
    11.   item_id;  


    很明显,对于任何一个'property_name'我们都做了定义,如'color', 'size'。如果属性的类型不变的话,这个查询已经没有问题了。但是如果字段'property_name'经常变,并且可能会增加一个新的,那要怎么处理呢?难道只能每次去改这个查询语句么?这种情况下,就可以使用动态生成查询语句——读取表中字段'property_name'的所有值,根据该值动态的创建一个查询语句。

    动态生成查询的实现如下:

    [sql]  view plain  copy
    1. SET @sql = NULL;  
    2. SELECT  
    3.   GROUP_CONCAT(DISTINCT  
    4.     CONCAT(  
    5.       'MAX(IF(property_name = ''',  
    6.       property_name,  
    7.       ''', value, NULL)) AS ',  
    8.       property_name  
    9.     )  
    10.   ) INTO @sql  
    11. FROM properties;  
    12. SET @sql = CONCAT('SELECT item_id, ', @sql, ' FROM properties GROUP BY item_id');  

    执行该语句,会生成如下的查询语句(为了阅读方便,调整了下格式):

    [sql]  view plain  copy
    1. SELECT  
    2.   item_id,  
    3.   MAX(IF(property_name = 'color', value, NULL)) AS color,  
    4.   MAX(IF(property_name = 'size', value, NULL)) AS size,  
    5.   MAX(IF(property_name = 'weight', value, NULL)) AS weight  
    6. FROM  
    7.   properties  
    8. GROUP BY  
    9.   item_id  

    注意:

    MySQL对于GROUP_CONCAT结果用系统变量group_concat_max_len做了限制,默认值是1024。所以,如果你的表有很多列,最好将该值设大一些。

    [sql]  view plain  copy
    1. SET @@group_concat_max_len = 5000;  
    2. SELECT GROUP_CONCAT(column_name) FROM table;  

    经过执行动态生成语句,查询语句被写到变量@sql里,现在我们可以用prepared statment来执行该语句:

    [sql]  view plain  copy
    1. PREPARE stmt FROM @sql;  
    2. EXECUTE stmt;  
    3. DEALLOCATE PREPARE stmt;  

    结果:

    
    
    1. +---------+--------+--------+--------+
    2. | item_id | color | size | weight |
    3. +---------+--------+--------+--------+
    4. | 1 | blue | large | 65 |
    5. | 2 | orange | large | 57 |
    6. | 3 | red | small | 12 |
    7. | 4 | violet | medium | 34 |
    8. | 5 | green | NULL | 10 |
    9. +---------+--------+--------+--------+


    展开全文
  • mysql中将多条记录合并一行数据进行显示,说实话,实际开发中很少有这样的,但既然碰见了,在这里几记录一下吧:正常情况下:SELECT REPAY_WAYS, REPAY_PLAN_ID FROM repay_line_info WHERE REPAY_WAYS IS NOT...

    mysql中将多条记录合并成一行数据进行显示,说实话,实际开发中很少有这样的,但既然碰见了,在这里几记录一下吧:

    正常情况下:

    SELECT
    	REPAY_WAYS,
    	REPAY_PLAN_ID
    FROM
    	repay_line_info
    WHERE
    	REPAY_WAYS IS NOT NULL
    ORDER BY
    	REPAY_PLAN_ID;

    查询出的数据也是这样的:


    但是我想把同一组的数据显示到同一行里面,那就需要依赖GROUP_CONCAT这个函数了。使用如下:

    SELECT
    	GROUP_CONCAT(
    		CONCAT(
    			rlo.REPAY_AMOUNT,
    			'元  ',
    			rlo.REPAY_WAYS
    		)
    	) AS REPAY_WAYS,
    	rlo.REPAY_PLAN_ID
    FROM
    	repay_line_info rlo
    GROUP BY
    	rlo.REPAY_PLAN_ID

    结果如下图:


    展开全文
  • 场景:产品列表显示产品的个标签 mysql 查询。 以往的解决办法都是查出先查出产品列表,在循环查询标签,个标签用","隔开。 这样查询列表查次数据库,循环列表又要查询数据库次。性能太差。 表结构: ...
  • 主要介绍了mysql将多行数据合并一行的方法,需要的朋友可以参考下
  • 一个字段可能对应多条数据,用mysql实现将多行数据合并一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: 1 SELECT am.activeId,m.modelName 2 FROM activemodel am 3 ...
  • select GROUP_CONCAT(xxx SEPARATOR ',') from table_name group by xxxGROUP_CONCAT()中的值为你要合并数据的字段名,默认缺省为个...必须要用GROUP BY 语句来进行分组管理,不然所有的数据都会被合并一条记录
  • 变为 SELECT policy_id, MAX(CASE fee_type WHEN '3' THEN before_tax_amount ELSE 0 END) before_tax_amount, MAX(CASE fee_type WHEN '3' THEN rate ELSE 0 END) commission_rate, MAX(CASE fee_type W...
  • 我们日常查询数据时,经常会有将查询到的数据按照某列分组显示(合并多行数据),比如: 表结构: create table t_user_course(username varchar(32),coursename varchar(100));   需要将以上数据按照...
  • Mysql多条数据的某个字段合并

    千次阅读 2018-12-07 12:03:48
    sql语句将多条数据的某个字段的多条数据合并个字段 场景:简历标签表中一条简历有多个标签,将简历的多条标签合并个字段 使用sql的GROUP_CONCAT() 实现合并 SELECT GROUP_CONCAT(tag_code) AS tag_code,fk_...
  • MySql查询返回多条数据多列合并

    千次阅读 2018-11-30 17:12:22
    最近帮人做了个成绩单打印的功能,需要在成绩单上打印出成绩划分等级和具体的成绩范围,左思右想~~~在条SQL搞定和循环多条记录拼接之间徘徊,由于时间匆忙,还是选择了简单的查询、循环、拼接。但是还是不甘心,...
  • 最近在oa项目中使用acitiviti中,遇到个排他网关有个判断条件(),并且可以次执行,在显示已办任务的时候要归属为一条数据,利用GROUP_CONCAT和CONCAT加上group by 解决。 详细sql如下: SELECT aht.ID_ AS...
  • 各位,我的数据库中有些数据需要整理,如图所示是例子, ![图片说明]... 如何将这三个除了标签不一样的数据合并数据,相同数据保留,标签变成top250,文学,爱情
  • 把查询name字段得到的多行记录进行合并,可以通过程序实现,但也可直接在sql层完成,需要的朋友可以参考下
  • mysql多行合并一行一列

    万次阅读 2012-06-19 18:15:56
    mysql> select * from aa; +------+------+ | id| name | +------+------+ |1 | 10| |1 | 20| |1 | 20| |2 | 20| |3 | 200 | |3 | 500 | +------+------+ 6 rows in set (0.00 sec) 以id分组,...
  • 可以使用group_concat函数: 参考地址: https://www.cnblogs.com/zjfjava/p/11136034.html
  • 利用函数:group_concat(),实现一个ID对应个名称时,原本为多行数据,把名称合并一行
  •  今天碰到个问题,由于表关联查询的关系,返回的数据中有2id相同但是其中个字段(职称)不同的结果,这个字段还必须展示并且以此字段查询。  因为id相同所以使用group by id就可以了,但是分组之后的数据...
  • MySQL_函数GROUP_CONCAT_合并多行数据一行GRGROUP_CONCAT(expr) 该函数返回带有来自一个组的连接的非NULL值的字符串结果。其完整的语法如下所示: GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY
  • 说明:文中使用的MySQL版本为MySQL8.0.17;MySQL配置文件中的sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION",此时select后跟的字段与group by后跟的字段不需要保持一致。 创建测试表: # 创建测试表...
  • MySQL数据库将多条记录的单个字段合并条记录 函数:  GROUP_CONCAT(字段名): 将 某字段 多条数据合并;  SEPARATOR " 分隔符 ": 指定分隔符; 测试语句:   单字段:   SELECT GROUP_CONCAT...
  • SELECT GROUP_CONCAT(relation_rms_name) FROM t_order_status AS B WHERE B.id = '011WBSWEB20180403111205582'
  •  在MySQL 5.6环境下,应工作需求:将个表中多条某个相同字段的其他字段合并(不太会表达,有点绕,直接上图)    想要达到的效果:    实现SQL语句: 1 SELECT 2 a.books, 3 GROUP_CONCAT(a.name ...
  • 今天在做一个跑批任务中,需要在oracle函数里把多行数据合并一行,顺道发挥下常用的几种方法。 一、wm_concat wm_concat函数是是oracle中常用的函数,功能:行转列,可以将查询出的多行某列值使用逗号进行隔开...
  • 多行数据合并一行

    千次阅读 2018-10-30 16:46:42
    然而现在只能在大数据平台(maxcompute)编写sql,不能借助任何高级语句(如java),要实现将表内的数据一行的形式存储到   with a1 as ( select user_level,count(id) as count from XXXXXXX where ...
  • mysql多条记录判断相加减合并一

    千次阅读 2013-08-09 17:38:09
    把code相同并payflag=0的pay相加减去payflag=1的pay得到下面这下的数据     code              pay   00001    100.00    00002      200.00  select code,sum(if(payflag=0,pay...
  • 一张表 有以下列 id、qq、wx,要求合并表中重复数据,只要有任意列的数据相同则合并其他列的结果 sql语句应该怎么实现?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,070
精华内容 20,028
关键字:

mysql多条数据合并一行

mysql 订阅