MySQL - 使用GROUP BY的边缘情况

时间:2013-04-12 08:28:22

标签: mysql group-by

我对GROUP BY的理解是它的标准用途是聚合项目。所以一个典型的例子可能是:

select 

count(id),
department,

from table
group by department

以上是每个部门所有身份证的计数。

所以,我使用group by教了一个非常有用(但可能非常狡猾!)的技巧。我想知道这种用法是否有任何问题。虽然查询按预期运行[结果在所有情况下都是预期的],但我的狡猾感有点刺痛......

想象一下以下数据集:

id  |  user_id  |  cost  |  note
----------------------------------
1         1         120     Test 1
2         1         150     Test 2
3         2         100     Test 3
4         3         120     Test 4

现在,如果我们执行以下SQL:

select * from table
group by user_id

您将获得以下结果集。

id  |  user_id  |  cost  |  note
----------------------------------
1         1         120     Test 1
3         2         100     Test 3
4         3         120     Test 4

查询显然如下:

  • 贯穿整个表格
  • 找到可分组的用户ID时,忽略后续的用户ID
  • 返回此唯一user_id项目表

实际上我得到一个“独特”,具有特定的界限,我可以从这个列表中选择*。 此外,通过在订单之前订购表格,我可以使用它来过滤所有费用。

所以 - 这也是你所期望的......但是:

在ABOVE示例中 - 假设我实际上确保了对于user_id 1,显示了值120(与其他可能的值相反 - 在这种情况下为150)。然后120似乎保证是回应。 然后可以通过某些顺序按字母顺序/数字/其他高级过滤器等进行排序......然后使用此排序强制表格中的第一项成为“答案”。

我想要做的实际查询非常复杂。使用MIN或类似的东西不适合我想要的最终值...但是:这个“订购你的表然后使用group by第一个独特的项目”方法实际上相当优雅(我认为)。 我实际上是通过约束4个字段来使用group,这与其他SQL结合起来做出了正确的答案。

因此。在那漫长的背景之后:一个问题!

我所使用的所有文档仅讨论了使用group by和聚合函数。我似乎无法找到JUST group by的行为。 这让我感到有两件事:

  • 未记录的正确(错误)用例
  • 我正在使用的任何版本的mySQL的意外行为。

那么......是哪一个? 如果这是一个正确的,但边缘情况,行为,那么很好。如果我欺骗SQL引擎吐出一些东西,那么我没有证据证明它与未来的版本兼容,所以我很难用它。

提前干杯。

2 个答案:

答案 0 :(得分:3)

在其他RDMS中,如果没有聚合函数,则不能在GROUP BY子句中没有使用GROUP BY子句,这是有道理的,因为这些字段需要聚合(min,max) ,计数等)但在mysql中它允许你使用没有任何聚合函数的字段,它会显示该字段遇到的第一个值。
mysql的这种行为有利有弊:
   - 专业人士:您可以使用它来获取该字段遇到的第一个值
   - 缺点:如果你不知道这种行为,你可能会得到腐败的结果

答案 1 :(得分:0)

通过以上链接/帮助调查后,我认为不幸的是:虽然答案是正确的,但并不保证是正确的......更确切地说,它是“不确定的”。

我真的很有信心,在我多次成功使用它之后,内部工作是“先到先得”,但是规范也说这不能保证,所以我不能依赖它。

为所有人提供帮助。投票赞成所有评论。