在MySQL中按多个列进行分组,并且这些列具有相等的优先级。
在MySQL中按多个列进行分组,并且这些列具有相等的优先级。
我有一个数据表,我想要输出那些两列内容不重复的所有数据,一个例子:
示例表格:
列1 | 列2 | 列3 1 XX 弹出 2 YY yif 3 ZZ 弹出 4 PP 弹出 5 XX 弹出 6 YY yif 7 PP Hor 8 MM tre 9 PP 弹出 10 XX 弹出 11 MM 弹出
我想要做的是输出所有行,其中列2和列3的值都不重复,所以你会看到列1 == 1和列1 == 5在列2和列3中有相同的值,所以只需要输出列1 == 1而不等于5(或等于10)的行。
我想要设置查询来输出所有行,除了列1 == 5, 6, 9, 10,因为这些行中的列2和列3都有重复。
查询的预期输出结果:(注意:所有三列都是必需的)
列1 | 列2 | 列3 1 XX 弹出 2 YY yif 3 ZZ 弹出 4 PP 弹出 7 PP Hor 8 MM tre 11 MM 弹出
我尝试过使用Group By,但它似乎只能按照一列进行分组,或者至少按照从左到右的顺序进行分组,所以GROUP BY (列2, 列3)
会先按照列2的值进行分组,然后再按照列3的值进行分组,而不是平等地处理两列。
我找到了一个可能的解决方案,那就是在之前将列连接起来,例如GROUP BY CONCAT(列2, '_', 列3)
,来自于Is it possible to GROUP BY multiple columns using MySQL?,但是这个解决方案在某种程度上受到了批评(至少作为那个问题的答案),但是它似乎是我见过的最接近实现我想要的功能的代码。
- 那么,我应该如何组织我的GROUP BY子句来达到这个结果?
- 我找到的GROUP BY CONCAT的方法是一个好的方法吗?
在MySQL中,当我们需要按多个列进行分组,并且这些列的优先级相等时,可能会遇到问题。下面是一个关于这个问题的解决方法:
问题的原因是我们需要按多个列进行分组,但是这些列的优先级相等。在这种情况下,我们无法简单地使用GROUP BY子句来实现分组。如果我们不关心Column1列,我们甚至不需要使用GROUP BY,只需要使用DISTINCT关键字就可以解决问题。具体解决方法如下:
SELECT DISTINCT Column2, Column3 FROM the_table ORDER BY however_you_want ;
这将返回根据Column2和Column3进行去重后的结果集,并按照你指定的排序方式进行排序。
然而,如果我们需要对所有列进行分组,并且Column1是最重要的列,那么上述方法就无法满足要求。在这种情况下,我们可以参考Norbert的回答,他给出了更适合的解决方案。
总结起来,当我们需要按多个列进行分组,并且这些列的优先级相等时,我们可以使用DISTINCT关键字来实现简单的分组,如果需要对所有列进行分组,并且有重要列存在,则需要使用其他方法来解决。
在MySQL中,可以通过多个列进行GROUP BY
操作。根据您想要的结果,您需要对其余数据应用额外的GROUP
函数。在您的情况下,似乎您想要的是第一个column1
索引和(column2,column3)
的唯一组合。
下面的查询可以解决这个问题:
SELECT MIN(column1) AS column1,column2,column3 FROM table1 GROUP BY column2,column3 ORDER BY MIN(column1) ASC;
测试这个SQL代码后,发现它返回了我想要的结果,谢谢。您能解释一下SELECT MIN(column1) AS column1,column2,column3
对GROUP BY
的影响吗?我不太熟悉那个语法。谢谢。
我认为SELECT MIN(column1)
只是为了给出该列2和3的组合的最低ID。