mysql - SQL Group-By 最频繁

标签 mysql sql

<分区>

假设我有下表

+-----------------------+----------------+
| PERSON                | ATE            |
+-----------------------+----------------+
| Joe                   | Chicken        |
| Joe                   | Chicken        |
| Joe                   | Chicken        |
| Joe                   | Tuna           |
| Joe                   | Tuna           |
| Joe                   | Chicken        |
| Joe                   | Tuna           |
| Joe                   | Chicken        |
| Joe                   | Tuna           |
| Joe                   | Tuna           |
| Joe                   | Tuna           |
| Joe                   | Chicken        |
| Joe                   | Tuna           |
| Joe                   | Tuna           |
| Joe                   | Chicken        |
| Joe                   | Tuna           |
| Joe                   | Tuna           |
| Joe                   | Tuna           |
| Rob                   | Chicken        |
| Rob                   | Tuna           |
| Rob                   | Chicken        |
| Rob                   | Chicken        |
| Rob                   | Chicken        |
| Rob                   | Chicken        |
| Jonathan              | Tuna           |
| Jonathan              | Tuna           |
| Jonathan              | Chicken        |
| Jonathan              | Tuna           |
| Jonathan              | Chicken        |
+-----------------------+----------------+

我想找出每个人最常吃的食物。因此,期望的结果将是:

+-----------------------+----------------+
| PERSON                | ATE            |
+-----------------------+----------------+
| Joe                   | Tuna           |
| Rob                   | Chicken        |
| Jonathan              | Tuna           |
+-----------------------+----------------+

自然地,我会 GROUP BY (Person)。之后,我必须找到每组中最常吃的东西。如果它们是数字,那会很容易,因为我可以只使用 MAX 函数,但我不知道如何从一堆中挑选出最受欢迎的字符串。

您将如何完成我在 SQL 中尝试做的事情?

最佳答案

您可以使用相关子查询:

select distinct t1.PERSON, (
    select ATE
    from myTable t2
    where t2.PERSON = t1.PERSON
    group by ATE
    order by count(*) desc
    limit 1
) as ATE
from myTable t1

如果有联系,此查询将“随机”选择吃得最多的项目之一。

使用 MySQL 8 或 MariaDB 10.2(都还不稳定)您将能够使用 CTE(通用表表达式)

with t1 as (
    select PERSON, ATE, count(*) as cnt
    from myTable
    group by PERSON, ATE
), t2 as (
    select PERSON, max(cnt) as cnt
    from t1
    group by PERSON
)
    select *
    from t1
    natural join t2

在关系上,此查询可能会为每个组 (PERSON) 返回多行。

关于mysql - SQL Group-By 最频繁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46964032/

相关文章:

Mysql选择多边形包含点的位置始终为false

mysql - 尝试使用 case 语句为列设置不同的值

mysql - 使用mysql进行复杂排序和分组

python - 在mysql中获取自动递增的行ID的时间复杂度

mysql - SQL查询中如何在两列之间进行除法

sql - SQL Server 中的递归查询问题

sql - 执行非常复杂的 SQL 分组的有效方法 :

php - 有没有办法在插入 MYSQL 时通知用户成功/错误?

php - 有没有办法在 PHP 中按表名分隔 MySQL 查询结果?

sql - 如何为复杂数据建模