是否可以在 MySQL 中按多列(OR 语句)进行分组?

Is it possible to group by multiple columns (OR statement) in MySQL?

我想按 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 列的连接的结果可能是:

blue,red,black
brown,pink,orange

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

所以它就像一个“按组”但考虑到 2 列:-P 很难解释,但我希望视觉例子自己说话。

顺便说一句:我在MySQL 8 ...无论哪一个,如果我必须升级或更改,我都可以做到;-)

根据您的描述和最终结果

你可以用这个。

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

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
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)))
:---- | :--- | :---------------------------------------------------------------------------------------------------------------------------
B     | R,S  | blue,red,black                                                                                                              
F     | U,V  | brown,pink,orange                                                                                                           
A     | Q    | green                                                                                                                       
B     | S    | red                                                                                                                         
C     | T    | purple                                                                                                                      
F     | V    | pink                                                                                                                        
G     | W    | white                                                                                                                       

db<>fiddle here

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

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

我想这是您预期结果中的错字。