Jak*_*son 11 mysql greatest-n-per-group
假设我有下表
-----------------------------
| user_id | comment |
-----------------------------
| 2 | thats cool |
| 2 | awesome |
| 3 | i hate this |
| 3 | okay |
| 6 | this is weird |
| 6 | hello? |
| 6 | what is it |
| 9 | how are you |
| 16 | too slow |
| 16 | yes |
| 17 | alrighty |
-----------------------------
Run Code Online (Sandbox Code Playgroud)
你怎么能选择一行user_id?所以我的结果是:
-----------------------------
| user_id | comment |
-----------------------------
| 2 | thats cool |
| 3 | i hate this |
| 6 | this is weird |
| 9 | how are you |
| 16 | too slow |
| 17 | alrighty |
-----------------------------
Run Code Online (Sandbox Code Playgroud)
这可以通过一个有效的查询实现吗?还是需要分选?是否可以以某种方式DISTINCT在单列上使用?
ype*_*eᵀᴹ 10
这GROUP BY就是用来做的。获得一行(每组)。在这种情况下,它将显示所有不同的user_id值,对于其余的列,您可以(必须)使用聚合函数,如MIN(), MAX(), AVG(),SUM()因为每组将有多个值,并且只能显示一个。
SELECT
user_id
, MIN(comment) AS comment -- it will show the first in alphabetical order
-- you could also use MAX()
FROM
tableX
GROUP BY
user_id ;
Run Code Online (Sandbox Code Playgroud)
MySQL 还允许以下非正统解决方案,它将为每个用户返回一个(或多或少随机)评论:
SELECT
user_id
, comment
FROM
tableX
GROUP BY
user_id ;
Run Code Online (Sandbox Code Playgroud)
如果ONLY_FULL_GROUP_BY启用了(更严格的)模式,最后一个查询将不起作用,但会引发错误。在最近发布的 5.7 版本中,此模式为默认模式ANY_VALUE(),并提供了新功能。有关更多详细信息,请参阅MySQL 处理GROUP BY页面。现在可以编写查询:
SELECT
user_id
, ANY_VALUE(comment) AS comment
FROM
tableX
GROUP BY
user_id ;
Run Code Online (Sandbox Code Playgroud)
请注意,无论是“非正统”版本还是使用最近的ANY_VALUE()函数,如果我们在SELECT列表中添加更多列,它们的值不能保证来自同一行,只是来自同一组中的一行。它们的选择方式并不是完全随机的,取决于执行计划和使用的索引。
| 归档时间: |
|
| 查看次数: |
37484 次 |
| 最近记录: |