您好,这是一个棘手的问题。基本上,我可以找到适合您的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
我想显示每个类别下的所有其他行。
答案 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以便更快地进行检索。当然,只要您的索引设置正确即可。