假设我有下表
+-----------------------+----------------+
| 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 中尝试做的事情?
您可以使用相关子查询:
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) 的多行。