我对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
查询显然如下:
实际上我得到一个“独特”,具有特定的界限,我可以从这个列表中选择*。 此外,通过在订单之前订购表格,我可以使用它来过滤所有费用。
所以 - 这也是你所期望的......但是:
在ABOVE示例中 - 假设我实际上确保了对于user_id 1,显示了值120(与其他可能的值相反 - 在这种情况下为150)。然后120似乎保证是回应。 然后可以通过某些顺序按字母顺序/数字/其他高级过滤器等进行排序......然后使用此排序强制表格中的第一项成为“答案”。
我想要做的实际查询非常复杂。使用MIN或类似的东西不适合我想要的最终值...但是:这个“订购你的表然后使用group by第一个独特的项目”方法实际上相当优雅(我认为)。 我实际上是通过约束4个字段来使用group,这与其他SQL结合起来做出了正确的答案。
因此。在那漫长的背景之后:一个问题!
我所使用的所有文档仅讨论了使用group by和聚合函数。我似乎无法找到JUST group by的行为。 这让我感到有两件事:
那么......是哪一个? 如果这是一个正确的,但边缘情况,行为,那么很好。如果我欺骗SQL引擎吐出一些东西,那么我没有证据证明它与未来的版本兼容,所以我很难用它。
提前干杯。
答案 0 :(得分:3)
在其他RDMS
中,如果没有聚合函数,则不能在GROUP BY
子句中没有使用GROUP BY
子句,这是有道理的,因为这些字段需要聚合(min,max) ,计数等)但在mysql中它允许你使用没有任何聚合函数的字段,它会显示该字段遇到的第一个值。
mysql的这种行为有利有弊:
- 专业人士:您可以使用它来获取该字段遇到的第一个值
- 缺点:如果你不知道这种行为,你可能会得到腐败的结果
答案 1 :(得分:0)
通过以上链接/帮助调查后,我认为不幸的是:虽然答案是正确的,但并不保证是正确的......更确切地说,它是“不确定的”。
我真的很有信心,在我多次成功使用它之后,内部工作是“先到先得”,但是规范也说这不能保证,所以我不能依赖它。
为所有人提供帮助。投票赞成所有评论。