SELECT LIMIT 1 每列值?

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列表中添加更多列,它们的值不能保证来自同一行,只是来自同一组中的一行。它们的选择方式并不是完全随机的,取决于执行计划和使用的索引。

  • 在 **[`[greatest-n-per-group]`](http://stackoverflow.com/questions/tagged/mysql+greatest-n- per-group?sort=votes&pagesize=50)** 标签。 (2认同)