我有一个表(log_entries):
id|token|area|
1| 543 | AA |
2| 452 | BB |
3| 543 | BB |
4| 634 | CC |
5| 436 | AA |
我想创建前 5 个区域的列表,按 token 分组,但是使用的区域是 token 使用的最后一个区域。基本上是前 5 个区域的列表,其中每个 token 仅获得一票,并且它的投票是针对其记录的最后一个区域。
例如,对于上表,列表如下所示:
|area|count|
| BB | 2 |
| AA | 1 |
| CC | 1 |
如何在 MySQL 语句中执行此操作? (顺便说一句,表很大 > 50,000 行)
最佳答案
SQL 表表示无序集。您需要另一列来指定顺序。
以下是获取每个 token 的最新区域的一种方法:
select area, count(*)
from (select t.*,
(@rn := if(@t = token, @rn + 1,
if(@t := token, 1, 1)
)
) as seqnum
from t cross join
(select @rn := 0, @t := '') params
order by tokens, ??
) t
where seqnum = 1
group by area
order by count(*) desc;
您需要将 ??
替换为指定顺序的列名称,以确定最新的。
关于MySQL 使用 Group By 选择最大出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36612720/