数据库
首页 > 数据库> > MySQL最大N结果与联接表

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