首页 > 解决方案 > 是否可以在 MySQL 中按多列(OR 语句)分组?

问题描述

我想按 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 中......无论是哪一个,如果我必须升级或更改,我可以做到;-)

标签: mysqlgroup-bygroup-concat

解决方案


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

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

请参阅演示
结果:

col1 col3
一个 绿色
蓝色,红色,黑色
C 紫色的
F 橙色,棕色,粉红色
G 白色的

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


推荐阅读