MySql:检索另一列的列中出现的最多值

时间:2016-08-08 23:54:53

标签: php mysql sql

我在MySql中寻找一种方法来选择一列中出现最多的值。

E.g。这张表

+-------+-------+
|  Name | Signin|
+-------+-------+
| Name1 |   1   |
| Name1 |   2   |
| Name1 |   1   |
| Name1 |   3   |
| Name1 |   2   |
| Name1 |   2   |
| Name2 |   4   |
| Name2 |   5   |
| Name2 |   5   |
| Name2 |   5   |
| Name2 |   5   |
| Name2 |   6   |
+-------+-------+

Signin有两个= 1,三个= 2,一个= 3个母猪,对于Name1,最近的值是2,对于Name2,最近的值是5,如列中的Signin是一个= 4,四= 5,一= 6

我需要的结果是这样的

Name1 - 2
Name2 - 5

1 个答案:

答案 0 :(得分:1)

您正在寻找的是统计中的“模式”。大多数数据库支持CTE或窗口函数,简化了计算。如果您的数据不是太大,我认为以下聚合技巧是最简单的方法:

select name,
       substring_index(group_concat(signin order by cnt desc), ',', 1) as signin
from (select name, signin, count(*) as cnt
      from t
      group by name, signin
     ) ns
group by name;

以上并不总是奏效。一种可能性是使用两个聚合的sgeddes方法。另一种是使用变量:

select ns.*
from (select ns.*,
             (@rn := if(@n = name, @rn + 1,
                        if(@n := name, 1, 1)
                       )
             ) as rn
      from (select name, signin, count(*) as cnt
            from t
            group by name, signin
            order by name, count(*) desc
           ) ns cross join
           (select @n := '', @rn := 0) params
     ) ns
where seqnum = 1;