SQL Group-By 最常见

Nal*_*aan 3 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        |
+-----------------------+----------------+
Run Code Online (Sandbox Code Playgroud)

我想为每个人找到最常吃的食物。所以,想要的结果是:

+-----------------------+----------------+
| PERSON                | ATE            |
+-----------------------+----------------+
| Joe                   | Tuna           |
| Rob                   | Chicken        |
| Jonathan              | Tuna           |
+-----------------------+----------------+
Run Code Online (Sandbox Code Playgroud)

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

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

Pau*_*gel 5

您可以使用相关子查询:

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
Run Code Online (Sandbox Code Playgroud)

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

使用 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
Run Code Online (Sandbox Code Playgroud)

在平局上,此查询可能会返回每个组 (PERSON) 的多行。