我的数据库表中有 4 个类别。
我想获取数据库中每个类别中访问量最大的四篇文章。
这意味着获取 (类别 1 中访问次数最多的 4 篇文章)
+ (类别 2 中访问次数最多的 4 篇文章)
+ (类别 3 中访问次数最多的 4 篇文章)
+ (类别 4 中访问次数最多的 4 篇文章)
= 来自 4 个类别
的总共 16 篇文章
。
我想通过一个查询来做到这一点。
普通查询:
$sql="select ID,name,country from article where `active`='yes' order by `visit` desc limit 16 ";
文章表结构:
CREATE TABLE `article` (
`ID` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL default '',
`country` varchar(50) NOT NULL default '',
`town` varchar(30) NOT NULL default '',
`other_town` varchar(30) NOT NULL default '',
`title` varchar(255) NOT NULL default '0',
`size` varchar(30) NOT NULL default '',
`type` varchar(30) NOT NULL default '',
`tel` varchar(30) NOT NULL default '',
`mobile` varchar(30) NOT NULL default '',
`connect` varchar(30) NOT NULL default '',
`email` varchar(30) NOT NULL default '',
`photo1` varchar(100) NOT NULL default '',
`print` varchar(30) NOT NULL default '',
`small_pic1` varchar(100) NOT NULL default '',
`detail` text NOT NULL,
`add_by` int(11) NOT NULL default '0',
`cat` int(11) NOT NULL default '0',
`goods_type` enum('new','old') NOT NULL,
`add_date` date NOT NULL default '0000-00-00',
`end_date` date NOT NULL default '0000-00-00',
`period` varchar(30) NOT NULL default '',
`visit` int(11) NOT NULL default '0',
`comment` int(30) NOT NULL default '0',
`fav` varchar(15) NOT NULL default '',
`favorite` varchar(15) NOT NULL default '',
`active` varchar(15) NOT NULL default '',
`rate` int(11) NOT NULL default '0',
`short` text NOT NULL,
`add_to` varchar(50) NOT NULL default '',
`author` varchar(50) NOT NULL default '',
`author_img` varchar(50) NOT NULL default '',
`lang` varchar(10) NOT NULL default '',
`budget` varchar(50) NOT NULL default '',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
类别表结构:
CREATE TABLE `category` (
`ID` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL default '',
`img` varchar(255) NOT NULL default '',
`sub` int(11) NOT NULL default '0',
`type` varchar(20) NOT NULL default '',
`lang` varchar(10) NOT NULL default '',
`active` varchar(25) NOT NULL default '',
`add_by` int(11) NOT NULL default '0',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
最佳答案
这应该可以做到。基本上确定每个类别的行号,然后按访问列排序并选择前 4 个。这是一个精简版本,但应该明白要点(添加您需要返回的字段):
SELECT Id, Cat, Visit, Name
FROM (
SELECT
@curRow:=CASE WHEN @prevRow = A.cat THEN @curRow+1 ELSE 1 END AS rn,
A.Id,
A.Visit,
A.Cat, A.Name,
@prevRow:=A.cat AS clset
FROM (SELECT A.Id, C.Id as Cat, A.Visit, C.Name
FROM Articles A
JOIN Category C ON A.cat = C.id
ORDER BY A.Cat, A.Visit DESC
) A
JOIN (SELECT @curRow:=0) r
JOIN (SELECT @prevRow:=0) r2
) B
WHERE rn <= 4
还有一些 fiddle :http://sqlfiddle.com/#!2/b7260/1
祝你好运。
关于mysql - 我想获得每个类别中访问量最大的文章(4 个类别),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14856818/