MySQL最大N结果与联接表
作者:互联网
在选择前n个结果时,我已经看到了很多有关如何执行此操作的文章和精彩文章,但是我正努力用自己的数据集进行操作.大多数示例着重于数据集,而无需其他联接.
我一直在尝试将http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/的示例应用于我的查询,但收效甚微.
人,信用和媒体这三个表存在.
人链接到信用和信用到媒体.
下面的查询应该返回每人前5种媒体,但是没有,我哪里出错了?
SELECT
p.id AS person_id,
c.id AS credit_id,
m.id AS media_id, m.rating_average
FROM person p
INNER JOIN credit c ON c.person_id = p.id
INNER JOIN media m ON m.id = c.media_id
where (
select count(*) from media as m2
inner JOIN credit c2 on m2.id=c2.media_id
where c2.person_id = c.person_id and m2.rating_average >= m.rating_average
) <= 5
澄清:
热门媒体是根据那些具有最高rating_average的媒体计算得出的.
更新:
SQLFiddle http://sqlfiddle.com/#!9/eb0fd
每人(p)所需的前3种媒体(m)的期望输出.显然,我希望能够在前5种媒体上做到这一点,但这只是测试数据.
p m c rating_average
1 9 27 9
1 7 28 8
1 1 1 8
2 1 5 8
2 4 8 8
2 7 29 8
3 4 10 8
3 3 9 6
3 5 11 5
4 3 13 6
4 5 14 5
4 6 15 3
5 4 16 8
5 5 17 5
5 6 18 3
6 6 19 3
7 7 20 8
8 9 23 9
8 1 21 8
8 8 22 0
9 1 24 8
9 7 26 8
9 5 25 5
解决方法:
我想我解决了:)
首先,这是一个基于您的开始方式的解决方案.但是有一个问题,我无法解决,以显示每个person_id的确切3行(或您选择的任何数字,例如我选择3).问题在于解决方案是基于计算有多少行,而rating_average大于当前行.因此,如果您有5个相同的最高价值,则可以选择全部显示5个,也可以不显示全部5个,这不好.因此,这就是您的操作方式…(当然,这是示例,如果您拥有4个最高价值,则将它们全部显示出来(我认为不显示数据根本没有意义))…
SELECT t1.person_id, t1.credit_id, t1.media_id, t1.rating_average
FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id,
m.rating_average AS rating_average
FROM person p
INNER JOIN credit c ON c.person_id = p.id
INNER JOIN media m ON m.id = c.media_id) as t1
WHERE (SELECT COUNT(*)
FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id,
m.rating_average AS rating_average
FROM person p
INNER JOIN credit c ON c.person_id = p.id
INNER JOIN media m ON m.id = c.media_id) AS t2
WHERE t2.person_id = t1.person_id AND t2.rating_average > t1.rating_average) < 3
ORDER BY person_id ASC, rating_average DESC
重要提示:如果您没有自己重复的值,则此解决方案可以起作用(为每个人显示准确的3行)…在Fiddle http://sqlfiddle.com/#!9/eb0fd/64中,您可以看到person_id为1的问题!
在那之后,我发挥了更多作用,并使其按照您认为的问题运行.这是一个代码:
SET @num := 0, @person := 0;
SELECT person_id, credit_id, media_id, rating_average, rowNumber
FROM (SELECT t1.person_id, t1.credit_id, t1.media_id, t1.rating_average,
@num := if(@person = t1.person_id, @num + 1, 1) AS rowNumber,
@person := t1.person_id
FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id,
m.rating_average AS rating_average
FROM person p
INNER JOIN credit c ON c.person_id = p.id
INNER JOIN media m ON m.id = c.media_id
ORDER BY p.id ASC, m.rating_average DESC) as t1) as t2
WHERE rowNumber <= 3
这是http://sqlfiddle.com/#!9/eb0fd/65的小提琴…
GL!
P. S.对不起,我希望您能明白我在说什么…
标签:mysql,greatest-n-per-group 来源: https://codeday.me/bug/20191009/1879897.html