可以说我有下表
-----------------------------
| 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 |
-----------------------------
你怎么能选择每行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 |
-----------------------------
这可以通过一个有效的查询来实现吗?还是有必要进行分选?是否可以以某种方式DISTINCT
在单个列上使用?
这
GROUP BY
就是用途。获取一行(每组)。在这种情况下,它将显示所有不同的user_id
值,对于其余列,您可以(必须)使用聚合函数,如MIN()
,MAX()
,AVG()
,SUM()
因为每个组将有多个值,并且只能显示一个。MySQL 还允许以下非正统的解决方案,它将为每个用户返回一个(或多或少随机的)评论:
ONLY_FULL_GROUP_BY
如果启用(更严格)模式,最后一个查询将不起作用,但会引发错误。在最近发布的 5.7 版本中,此模式为默认模式,并ANY_VALUE()
提供了一个新功能 , 。有关更多详细信息,请参阅MySQL 处理GROUP BY
页面。现在可以编写查询:请注意,无论是使用“非正统”版本还是使用最近的
ANY_VALUE()
函数,如果我们在SELECT
列表中添加更多列,则不能保证它们的值来自同一行,只是来自同一组中的一行。它们的选择方式并非完全随机,取决于执行计划和使用的索引。