sql代码显示id大于4的每个类别的最大观看次数

时间:2018-07-09 07:52:20

标签: php mysql sql

我有桌子=>帖子

 id  || category || views
-------------------------------
 1   |  cat1    |  100
 2   |  cat2    | 2900  <==== most views in cat 2
 3   |  cat3    |  200
 4   |  cat1    | 1900  <==== most views in cat 1
 5   |  cat1    |  800
 6   |  cat2    |  800
 7   |  cat3    | 2700  <==== most views in cat 3
 8   |  cat2    |  900
 9   |  cat3    |  100
 10  |  cat1    |  100
 11  |  cat2    |  1200
 12  |  cat3    |  1500
 13  |  cat3    |  1100
 14  |  cat2    |  1700
 15  |  cat1    |  100

现在,如果只是为了通过单击类别选项卡进行理解而进行排列,它将在我的数据库中排列如下表格:

   id  || category || views
    -------------------------------
     1   |  cat1    |  5100  <==== most views in cat 1
     4   |  cat1    |  1900  
     5   |  cat1    |  800
     10  |  cat1    |  100
     15  |  cat1    |  100

     5   |  cat2    | 2000  <==== most views in cat 2
     6   |  cat2    |  800
     8   |  cat2    |  900
     11  |  cat2    |  1200
     14  |  cat2    |  1700

     3   |  cat3    |  200
     7   |  cat3    | 3000  <==== most views in cat 3
     9   |  cat3    |  100
     12  |  cat3    |  1500
     13  |  cat3    |  1100

现在我希望sql代码首先检查id为no的cat 1中具有最大视图的行。 1如上所示。现在,如果该行(即ID号1)的ID小于等于4,那么在此不显示该类别的任何行,我不希望sql代码在跳过ID号1之后重新检查具有最大视图的另一行,一旦最大ID小于4的sql代码行应跳过该类别,则该类别的任何行都不应显示在结果中。 现在检查下一个类别并循环。

我现在想要提供所需的输出,如下所示:

     id  || category || views
    -------------------------------
     5   |  cat2    |  2000  <==== most views in cat 2
     14  |  cat2    |  1700
     11  |  cat2    |  1200
     8   |  cat2    |  900
     6   |  cat2    |  800

     7   |  cat3    | 3000  <==== most views in cat 3
     12  |  cat3    |  1500
     13  |  cat3    |  1100
     3   |  cat3    |  200
     9   |  cat3    |  100

注意:cat1和cat2之间的差距只是为了区分类别和您的理解,我不希望在我的输出中出现差距。

现在,在检查ID大于4的最大视图之后,输出应按类别进行排序,因为所需输出中每个类别中的行数都超过1,我希望按视图所示对视图进行进一步排序。

现在我也想按如下所示的最大视图顺序订购所需的输出表:

     id  || category || views
    -------------------------------
     7   |  cat3    | 3000  <==== most views in cat 3
     12  |  cat3    |  1500
     13  |  cat3    |  1100
     3   |  cat3    |  200
     9   |  cat3    |  100

     5   |  cat2    |  2000  <==== most views in cat 2
     14  |  cat2    |  1700
     11  |  cat2    |  1200
     8   |  cat2    |  900
     6   |  cat2    |  800

因为id 7的值小于id 5

感谢。

我的查询我编辑了@radim baca:

select p0.*
from post p0 
join post p1 on p0.category= p1.category
join
(
    select p2.category, max(p2.views) as max_views
    from post p2
    group by p2.category
) p2 on p2.category= p1.category and 
        p2.max_views = p1.views and
        p1.id > 4 order by p2.max_views desc, category desc , views desc

3 个答案:

答案 0 :(得分:1)

如果您要获取post表中的行,其中每个views的{​​{1}}值最高的行的category多于4,则使用以下查询:

id

答案 1 :(得分:0)

检查一下:

create table demo(id int , category nvarchar(max) , vview int)

insert into demo(id,category,vview)  values 
(1,'cat1',100),(2,'cat1',500),(3,'cat2',400),(4,'cat2',1100),
(5,'cat3',700),(6,'cat3',1800),(7,'cat1',5800),(8,'cat3',3500)

select id, rank() over(partition by category order by vview desc)  rankk , 
category , vview from demo order by rankk

在这里工作:http://sqlfiddle.com/#!18/e5f89

答案 2 :(得分:0)

找出每只猫的最大值。仅使用该信息构建临时表。

cat2  2000
cat3  3000

CREATE TEMPORARY TABLE t (PRIMARY KEY cat)
    SELECT cat, MAX(views) AS max_views FROM post GROUP BY cat;

我们将使用数字代替名称来进行最终的排序。

SELECT cat, views
    FROM post
    JOIN t USING(cat)
    ORDER BY t.max_views DESC, post.views DESC;

(我不了解关于id>4的限制)

相关问题