我有这张表:
CREATE TABLE IF NOT EXISTS `catalog_sites` (
`id` int(10) unsigned NOT NULL auto_increment,
`cat_id` int(10) unsigned NOT NULL,
`date` datetime NOT NULL,
`url` varchar(255) NOT NULL,
`title` varchar(255) NOT NULL,
`description` varchar(255) NOT NULL,
`keywords` varchar(255) NOT NULL,
`visited` int(10) unsigned NOT NULL,
`shown` int(10) unsigned NOT NULL,
`meta_try` int(1) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
我认为我的问题很简单,但似乎找不到合适的解决方案。
所以,这是一个包含网站的表,我希望获得 6 个不同类别的 6 个网站(cat_id,总计:36 行),每个类别的评级最高。评级的计算方式为visited
/ shown
.
我应该得到 36 行,其中包含 6 个顶级类别(我们可以通过排序找到它们AVG(visited / shown)
),以及这 6 个类别中每个类别的 6 个顶级网站。
如果您有任何想法如何以不同的方式发生这种情况,请告诉我。
这应该可以让你使用 MySQL 变量得到你想要的,内部查询将预先计算访问/显示的排名,并使用你想要的条件的排序...每个类别,最高排名...然后使用@vars 将按顺序保持 @RankSeq 1-?每个类别。从该预查询(别名 PQ)中,OUTER 查询仅查询 URL 排名顺序
为了进一步确保您只获得前 6 个类别,内部 PreQuery 还具有“TopCategories”(别名)的预查询/限制
select
PQ.URL,
PQ.Cat_ID,
PQ.Rank,
PQ.URLRankSeq
from
( select
CS.cat_id,
(CS.visited / CS.shown ) as Rank,
CS.url,
@RankSeq := if( @LastCat = CS.Cat_ID, @RankSeq +1, 1 ) URLRankSeq,
@LastCat := CS.Cat_ID as ignoreIt
from
( select cat_id,
avg( visited / shown )
from catalog_sites
group by 1
order by 2 desc
limit 6 ) TopCategories
JOIN catalog_sites CS
on TopCategories.Cat_ID = CS.Cat_ID,
(select @RankSeq := 0, @LastCat = 0 ) SQLVars
order by
CS.cat_id,
Rank ) PQ
where
PQ.URLRankSeq <= 6
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)