如何在MySQL Select语句中按多个列进行分组
在MySQL的SELECT语句中,可以使用GROUP BY子句对结果进行分组。通常情况下,我们只需要按照一个列进行分组,但有时候我们需要按照多个列进行分组。然而,在使用多个列进行分组时,可能会遇到一些问题。
在上面的代码示例中,我们可以看到GROUP BY子句后面有两个列名,用逗号分隔。这意味着结果将按照exp_date列和username列进行分组。然而,这种用法可能会引发一些问题。
问题的原因是,当我们在SELECT语句中使用GROUP BY子句时,我们只能选择列名或者表达式,而不能直接选择别名。因此,在上面的代码中,如果exp_date或username具有别名,则会导致语法错误。
为了解决这个问题,我们可以使用列的位置索引来代替列名或别名。在GROUP BY子句中,我们可以使用列的位置索引代替列名,如下所示:
GROUP BY 1, 2;
在上面的代码中,1代表exp_date列的位置索引,2代表username列的位置索引。通过使用位置索引,我们可以避免使用列名或别名,从而避免语法错误。
当我们需要在MySQL的SELECT语句中使用多个列进行分组时,可能会遇到语法错误的问题。为了解决这个问题,我们可以使用列的位置索引来代替列名或别名。这样,我们就可以顺利地按照多个列进行分组了。
问题的出现原因是需要在MySQL的SELECT语句中按多个列进行分组。解决方法是使用GROUP BY语句,并在其中以逗号分隔的形式列出要分组的列。
具体的解决方法如下:
SELECT username, exp_date, SUM(lodging) AS lodging, SUM(boarding) AS boarding, SUM(laundry) AS laundry, SUM(conveyance) AS conveyance FROM table GROUP BY exp_date, username;
如果要确保每人每天只有一行数据,可以在FROM和GROUP BY之间添加WHERE子句来筛选数据。
以上是解决问题的方法,不过根据表的设计来看,可能需要将表规范化为三个表,因为目前的设计只符合第二范式,但对于当前的需求来说,这样的设计已经足够。你可以点击下面的链接查看示例。
[sqlFiddle](http://sqlfiddle.com/#!9/195c05/2)
如果你想要每个人每天只有一行数据,而不是每个人每天都有数据,可以在FROM和GROUP BY之间添加WHERE子句来筛选数据。
你可以点击下面的链接查看示例。
[sqlFiddle](http://sqlfiddle.com/#!9/195c05/3)