group by+group_concat解决的小问题

矫情吗;* 2022-11-30 12:33 244阅读 0赞

  建测试表:

  1. CREATE TABLE test_001
  2. (
  3. id INT,
  4. type2 VARCHAR(10),
  5. bizId VARCHAR(10),
  6. batchId INT
  7. )
  8. INSERT INTO test_001(id,type2,bizId,batchId) VALUES(1,1,'uid1',1);
  9. INSERT INTO test_001(id,type2,bizId,batchId) VALUES(2,1,'uid2',1);
  10. INSERT INTO test_001(id,type2,bizId,batchId) VALUES(3,2,'fid1',1);
  11. INSERT INTO test_001(id,type2,bizId,batchId) VALUES(4,2,'fid2',1);
  12. INSERT INTO test_001(id,type2,bizId,batchId) VALUES(5,1,'uid3',2);
  13. INSERT INTO test_001(id,type2,bizId,batchId) VALUES(6,2,'fid3',3);
  14. SELECT * FROM test_001;

  第一次解决,KO!

  1. SELECT batchId,
  2. GROUP_CONCAT(uid) AS uid,
  3. GROUP_CONCAT(typeid) AS typeid
  4. FROM
  5. (SELECT batchId,
  6. CASE WHEN type2 = '1' THEN bizId
  7. ELSE NULL END AS uid,
  8. CASE WHEN type2 = '2' THEN bizId
  9. ELSE NULL END AS typeid
  10. FROM test_001) g
  11. GROUP BY batchId;

format_png

  看起来没什么毛病,哈哈哈!继续看看其他高手有没有什么值得学习的解决方案。

  1. SELECT * FROM test_001;
  2. SELECT batchId,
  3. GROUP_CONCAT(CASE WHEN type2 = 1 THEN bizId ELSE NULL END) AS "uid",
  4. GROUP_CONCAT(CASE WHEN type2 = 2 THEN bizId ELSE NULL END) AS "typeid"
  5. FROM test_001
  6. GROUP BY batchId;

  不采用子查询显得更加的优雅,get!结果符合要求!

  附原文链接:https://www.v2ex.com/t/535679


  顺手温习一下concat、concat_ws、group_concat函数的使用方法。

  •   concat(str1,str2,str3,…) 字符串拼接

  如果有任何一个参数为null,则返回值为null。

  •   concat_ws(separator,str1,str2,…)

  指定分隔符拼接,分隔符不能为null。

  •   group_concat( ) 分组拼接

  group_concat([distinct] col [order by xxx desc] [separator ‘分隔符’])

  1. SELECT * FROM test_001
  2. -- 例子1
  3. SELECT batchId,
  4. GROUP_CONCAT(bizId ORDER BY bizId DESC SEPARATOR '_') AS xxx
  5. FROM test_001
  6. GROUP BY batchId
  7. -- 例子2
  8. SELECT batchId,
  9. GROUP_CONCAT(CONCAT_WS('-',type2,bizId) ORDER BY bizId)
  10. FROM test_001
  11. GROUP BY batchId

发表评论

表情:
评论列表 (有 0 条评论,244人围观)

还没有评论,来说两句吧...

相关阅读