我对 GROUP BY 的理解是它的标准用途是聚合项目。所以一个典型的例子可能是:
select
count(id),
department,
from table
group by department
以上将计算每个部门的所有 id。
所以,我学会了一个非常有用的(但可能很狡猾!)使用 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 项目表
实际上,我得到了一个“独特的”,具有特定的边界,我可以从这个列表中选择 *。此外,通过在 order by 之前对表进行排序,我可以使用它来过滤所有成本。
所以 - 这也是你所期望的......但是:
在上面的示例中 - 假设我实际上确保对于 user_id 1,显示值 120(而不是其他可能的值 - 在本例中为 150)。然后 120 似乎可以保证是响应。然后,该方法可以按字母/数字/其他高级过滤器等顺序进行排序......然后使用这种排序来强制表中的第一项成为“答案”。
我想做的实际查询非常复杂。使用 MIN 或类似的不适合我想要的最终值......但是:这种“订购你的桌子然后使用 group by 获取第一个唯一项目”的方法实际上非常优雅(我认为)。我实际上是在 4 个字段中使用 group by 约束,这与其他 SQL 相结合可以得出正确的答案。
所以。在那长长的背景之后:一个问题!
我使用的所有文档都只讨论了将 group by 与聚合函数一起使用。我似乎找不到 JUST group by 的行为。这让我觉得是两件事之一:
- 未记录的正确(错误)用例
- 我正在使用的任何版本的 mySQL 的意外行为。
那么是哪一个呢?如果这是一个正确但边缘情况的行为,那就太好了。如果我欺骗 SQL 引擎吐出一些东西,那么我没有证据证明这与未来的版本兼容,所以我很难使用它。
提前祝大家好运。