什么是SQL来选择属性和相关属性的最大出现次数?

p.m*_*los 11 mysql

我有这样一张桌子:

Table: p
+----------------+
| id      | w_id |
+---------+------+
| 5       |  8   |
| 5       | 10   |
| 5       |  8   |
| 5       | 10   |
| 5       |  8   |
| 6       |  5   |
| 6       |  8   |
| 6       | 10   |
| 6       | 10   |
| 7       |  8   |
| 7       | 10   |
+----------------+
Run Code Online (Sandbox Code Playgroud)

获得以下结果的最佳SQL是什么?:

+-----------------------------+
| id      | most_used_w_id    |
+---------+-------------------+
|  5      |  8                |
|  6      | 10                |
|  7      |  8                |
+-----------------------------+
Run Code Online (Sandbox Code Playgroud)

换句话说,获得,每个id,最常见的相关w_id.请注意,在上面的示例中,id7与8次一次和10次相关.因此,(7,8)或(7,10)将作为结果.如果无法拿起一个,那么结果集上的(7,8)和(7,10)都可以.

我想出了类似的东西:

select counters2.p_id as id, counters2.w_id as most_used_w_id
from (
  select p.id as p_id, 
         w_id,
         count(w_id) as count_of_w_ids
  from p
  group by id, w_id
) as counters2

join (
  select p_id, max(count_of_w_ids) as max_counter_for_w_ids
  from (
    select p.id as p_id, 
           w_id,
           count(w_id) as count_of_w_ids
    from p
    group by id, w_id
  ) as counters
  group by p_id
 ) as p_max 

on p_max.p_id = counters2.p_id
   and p_max.max_counter_for_w_ids = counters2.count_of_w_ids
;
Run Code Online (Sandbox Code Playgroud)

但我完全不确定这是否是最好的方法.我不得不重复两次相同的子查询.

更好的解决方案?

And*_*Inc 0

尝试这个查询

select p_id, ccc , w_id from
(
select p.id as p_id, 
         w_id, count(w_id) ccc
  from p
  group by id,w_id order by id,ccc desc) xxx
group by p_id having max(ccc)
Run Code Online (Sandbox Code Playgroud)

这是sqlfiddle链接

如果您不想依赖非分组列的第一条记录,也可以使用此代码

select p_id, ccc , w_id from
(
select p.id as p_id, 
         w_id, count(w_id) ccc
  from p
  group by id,w_id order by id,ccc desc) xxx
group by p_id having ccc=max(ccc);
Run Code Online (Sandbox Code Playgroud)

  • 最简单,但_不正确_(正如我所提到的)。您_不能_相信MySQL将获取_第一个_记录。混合非组列时可以自由选择_任意_行 (4认同)