是否可以在 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 行:
- 组中的第 2、3 和 6 行
- 其他组中的第 5、7 和 8 行
- 在其他唯一行中
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
我想这是您预期结果中的错字。
我想按 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 行:
- 组中的第 2、3 和 6 行
- 其他组中的第 5、7 和 8 行
- 在其他唯一行中
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 |
我想这是您预期结果中的错字。