如何按大多数视图类别排序数据

时间:2018-07-08 10:43:21

标签: php mysql sql

您好,这是一个棘手的问题。基本上,我可以找到适合您的sql查询或php代码,因此就像我的表名为 post

所以我最终希望从表中首先检查每个类别中查看次数最多的帖子,然后按类别进行排序

TABLE ==> 发布

base.html

我的输出为:

     content || category || views
    -------------------------------
     text 1   |  cat1    |  700
     text 2   |  cat2    | 2900  <==== most views in cat 2
     text 3   |  cat3    |  200
     text 4   |  cat1    | 1900  <==== most views in cat 1
     text 5   |  cat1    |  800
     text 6   |  cat2    |  800
     text 7   |  cat3    | 2700  <==== most views in cat 3
     text 8   |  cat2    |  900
     text 9   |  cat3    |  100
     text10   |  cat1    |  100

我想要的输出是:

     content || category || views
   -------------------------------
     text 2   |  cat2    | 2900
     text 7   |  cat3    | 2700
     text 4   |  cat1    | 1900

基本上想爆炸每个类别下的所有行,但它显示了每个类别中查看次数最多的帖子。

我的查询:

     content || category || views
   -------------------------------
     text 2   |  cat2    | 2900
     text 8   |  cat2    | 900
     text 6   |  cat2    | 800
     text 7   |  cat3    | 2700
     text 3   |  cat3    | 200
     text 9   |  cat3    | 100
     text 4   |  cat1    | 1900     
     text 5   |  cat1    | 800 
     text 1   |  cat1    | 700   
     text 10  |  cat1    | 100 

我想显示每个类别下的所有其他行。

3 个答案:

答案 0 :(得分:2)

您只需要添加一个ORDER BY子句:

SELECT t1.*
FROM post t1
INNER JOIN
(
    SELECT category, MAX(views) AS max_views
    FROM post
    GROUP BY category
) t2
    ON t1.category = t2.category
ORDER BY
    t2.max_views,
    t1.category,
    t1.views;

还要注意,我从联接中删除了t1.views = t2.max_views条件。在这种情况下,您希望返回所有原始行。

答案 1 :(得分:1)

您似乎想要一个order by

select p.*
from post p
order by (select max(p2.views) from post p2 where p2.category = p.category) desc,
         p.category,
         p.views desc;

您也可以使用group by进行此操作:

select p.*
from post p join
     (select p2.category, max(p2.views) as max_views
      from post p2
      group by p2.category
     ) p2
     on p2.category = p.category
order by p2.max_views desc, p.category, p.views desc;

请注意,order by具有三个键。中间键p.category用于处理两个类别具有相同数量的最大观看次数的情况。

答案 2 :(得分:0)

我看不到需要进行子选择。您未指定类别本身的顺序:

select    content, category, views
from      post
order by  category, views desc

除非您真的希望类别根据其最受欢迎帖子的最大浏览量更改位置,否则应避免使用subselect以便更快地进行检索。当然,只要您的索引设置正确即可。