【问题标题】:Is it possible to group by multiple columns (OR statement) in MySQL?是否可以在 MySQL 中按多列(OR 语句)分组?
【发布时间】:2021-10-15 19:49:53
【问题描述】:

我想按 2 列分组,但在“或模式”下...我想我会用一个例子更好地解释自己:

ID  |  Col 1  |  Col 2  |   Col 3  | Rest of columns ...
-------------------------------------------------------
1        A         Q         green
2        B         R         blue
3        B         S         red
4        C         T         purple
5        D         U         orange
6        E         R         black
7        F         U         brown
8        F         V         pink
9        G         W         white

所以... 按第 1 列分组,我们将第 2+3 行和第 7+8 行合并到结果中 按第 2 列分组,我们将第 2+6 行和第 7+5 行合并到结果中

但我想在它们之间进行分组,因此 SQL 结果(在这种情况下)输出为 2 行:

  1. 组中的第 2、3 和 6 行
  2. 其他组中的第 5、7 和 8 行
  3. 在其他独特的行中

1) 组的视觉解释:

2) 组的视觉解释:

这在唯一的 SQL 中是否可行?还是在编程代码中处理这些数据“合并”更好?

所以选择第 3 列的 concat 的结果可能是:

blue,red,black
brown,pink,orange

(and then the rest that are "unique" of the two groupings...)
green
purple
white

所以它就像“按组”但考虑到 2 列:-P 这很难解释,但我希望视觉示例能自言自语。

顺便说一句:我在 MySQL 8 中……不管是哪一个,如果我必须升级或更改,我都可以做到 ;-)

【问题讨论】:

  • 使用 CTE,然后将它们联合起来。
  • 你用的是什么版本的 MySQL?
  • 另外,您还没有告诉我们我们应该如何知道哪一列(Col1Col2)应该用于任何给定的行。
  • "按第 1 列分组,我们有第 2+3 行和第 7+8 行" - 不,GROUP BY Col1 会给你( 1, 2+3, 4, 5, 6, 7+8, 9 ),而不是( 2+3 ) - 或者你想要一个隐含的HAVING COUNT(*) >= 2?
  • 您建议的行分组中的值有什么共同点?我无法从您的问题中看出您如何知道将 5、7 和 8 组合在一起。

标签: mysql group-by group-concat


【解决方案1】:

对于此示例数据,您可以使用自联接:

SELECT t1.col1, 
       GROUP_CONCAT(t2.col3) col3
FROM tablename t1 INNER JOIN tablename t2
ON t2.id = t1.id OR t2.col2 = t1.col2
GROUP BY t1.col1
HAVING COUNT(DISTINCT t1.id) > 1 OR COUNT(t2.id) = 1

请参阅demo
结果:

col1 col3
A green
B blue,red,black
C purple
F orange,brown,pink
G white

我猜这是您预期结果中的一个错字。

【讨论】:

    【解决方案2】:

    根据您的描述和最终结果

    你可以用这个。

    通过额外的子查询,您可以根据需要收集更多信息

    CREATE TABLE tab1 (
      `ID` VARCHAR(35),
      `Col 1` VARCHAR(35),
      `Col 2` VARCHAR(35),
      `Col 3` VARCHAR(35)
    );
    
    INSERT INTO tab1
      (`ID`, `Col 1`, `Col 2`, `Col 3`)
    VALUES
      ('1'        ,'A'         ,'Q' ,        'green'),
      ('2'        ,'B'         ,'R'   ,     'blue'),
      ('3'   ,     'B',         'S',         'red'),
      ('4'  ,      'C',         'T' ,        'purple'),
      ('5'        ,'D'        , 'U'     ,    'orange'),
      ('6'      ,  'E'         ,'R'         ,'black'),
      ('7'        ,'F'      ,  'U' ,        'brown'),
      ('8'       ,'F'       ,  'V' ,        'pink'),
      ('9',        'G ',        'W'      ,   'white');
    
    SELECT
    `Col 1`, col2
    , CONCAT(col3,',', (SELECT GROUP_CONCAT(`Col 3`) FROM tab1 WHERE FIND_IN_SET(`Col 2`,col2) AND NOT FIND_IN_SET(`Col 3`,col3)))
    
    FROM (SELECT `Col 1`, GROUP_CONCAT(`Col 2`) as col2, GROUP_CONCAT(`Col 3`) col3 
    FROM tab1 
    GROUP BY `Col 1` 
    HAVING COUNT(*) > 1) t1
    UNION
    SELECT `Col 1`, `Col 2`, `Col 3`
    FROM tab1
    GROUP BY `Col 2`
    HAVING COUNT(*) = 1
    
    第 1 栏 | col2 | CONCAT(col3,',', (SELECT GROUP_CONCAT(`Col 3`) FROM tab1 WHERE FIND_IN_SET(`Col 2`,col2) AND NOT FIND_IN_SET(`Col 3`,col3))) :---- | :--- | :------------------------------------------------- -------------------------------------------------- ---------------------- 乙| R,S |蓝色,红色,黑色 F | U,V |棕色,粉色,橙色 一个 |问 |绿色 乙|小号 |红色的 C | T |紫色的 F |五 |粉色的 克| W |白色的

    db小提琴here

    【讨论】:

      猜你喜欢
      • 2019-11-14
      • 2021-12-12
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      相关资源
      最近更新 更多