我有这样一张桌子:
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)
但我完全不确定这是否是最好的方法.我不得不重复两次相同的子查询.
更好的解决方案?
尝试这个查询
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)