我有这张桌子:
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 ;
我认为我的问题很简单,但似乎找不到合适的解决办法。
所以,这是一个包含web站点的表,我想得到6个不同类别的站点(cat_id,共36行),每个类别的评分最高。评级计算为
visited
/shown
。我应该得到36行,其中包含6个顶级类别(我们可以通过
AVG(visited / shown)
排序找到它们),以及这6个类别中每个类别的6个顶级站点。如果你有什么不同的想法,请告诉我。
最佳答案
这将得到您想要的使用mysql变量,内部查询将预先计算访问/显示的排名,并使用您想要的条件排序…每个类别,最高级别…然后使用@vars将使@rankseq按顺序保持1-?按类别。从预查询(别名pq)中,外部查询只查询url的秩序列为了进一步确保只得到前6个类别,内部pre query还对“topcortegories”(别名)有一个prequery/limit
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