mysql取最大的五组,mysql – 如何获得每个组的最大行?

我有一个数据库,人们为不同地方的人提交投票.在某个时间,我想找出每个地方谁拥有最多选票. (一个人可以在两个不同的地方投票)

这是我到目前为止的SQL:

SELECT placeId, userVotedId, cnt

FROM

(SELECT uvo.userVotedId, p.placeId, count(*) as cnt

FROM users as u, users_votes as uvo, places as p

WHERE u.userId = uvo.userVotedId

AND p.placeId = uvo.placeId

GROUP BY userVotedId, placeId)

AS RESULT

这给了我这个结果:

现在,这些是我真正想要的行:

我的查询中缺少什么,所以我可以得到这个?

>我想要每个地方一个结果.所以我应该只看到不同的placeIds,其中userVotedId获得了最多的选票.

>如果出现平局,随机获胜者将会做到!

解决方法:

好像你还需要一个聚合.在你的cnt值和GROUP BY placeId,userVotedId上使用MAX()聚合:

SELECT placeId, userVotedId, max(cnt)

FROM

(

SELECT uvo.userVotedId, p.placeId, count(*) as cnt

FROM users as u

INNER JOIN users_votes as uvo

ON u.userId = uvo.userVotedId

INNER JOIN places as p

ON p.placeId = uvo.placeId

GROUP BY userVotedId, placeId

) AS RESULT

GROUP BY placeId, userVotedId

注意:我更改了您的查询以使用JOIN语法而不是表之间的逗号.

根据您的评论进行编辑,以下内容应该有效:

select total.uservotedid,

total.placeid,

total.cnt

from

(

SELECT uvo.userVotedId, p.placeId, count(*) as cnt

FROM users as u

INNER JOIN users_votes as uvo

ON u.userId = uvo.userVotedId

INNER JOIN places as p

ON p.placeId = uvo.placeId

GROUP BY userVotedId, placeId

) total

inner join

(

select max(cnt) Mx, placeid

from

(

SELECT uvo.userVotedId, p.placeId, count(*) as cnt

FROM users as u

INNER JOIN users_votes as uvo

ON u.userId = uvo.userVotedId

INNER JOIN places as p

ON p.placeId = uvo.placeId

GROUP BY userVotedId, placeId

) mx

group by placeid

) src

on total.placeid = src.placeid

and total.cnt = src.mx

结果是:

| USERVOTEDID | PLACEID | CNT |

-------------------------------

| 65 | 11 | 1 |

| 67 | 13 | 1 |

| 67 | 25 | 1 |

| 67 | 51 | 2 |

编辑#2,如果你想要一个平局就返回一个随机数,那么你可以使用用户变量:

select uservotedid,

placeid,

cnt

from

(

select total.uservotedid,

total.placeid,

total.cnt,

@rownum := case when @prev = total.placeid then @rownum+1 else 1 end rownum,

@prev := total.placeid pplaceid

from

(

SELECT uvo.userVotedId, p.placeId, count(*) as cnt

FROM users as u

INNER JOIN users_votes as uvo

ON u.userId = uvo.userVotedId

INNER JOIN places as p

ON p.placeId = uvo.placeId

GROUP BY userVotedId, placeId

) total

inner join

(

select max(cnt) Mx, placeid

from

(

SELECT uvo.userVotedId, p.placeId, count(*) as cnt

FROM users as u

INNER JOIN users_votes as uvo

ON u.userId = uvo.userVotedId

INNER JOIN places as p

ON p.placeId = uvo.placeId

GROUP BY userVotedId, placeId

) mx

group by placeid

) src

on total.placeid = src.placeid

and total.cnt = src.mx

order by total.placeid, total.uservotedid

) src

where rownum = 1

order by placeid, uservotedid

标签:mysql,sql,greatest-n-per-group

来源: https://codeday.me/bug/20190520/1143520.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值