mysql - 我想获得每个类别中访问量最大的文章(4 个类别)

标签 mysql sql select group-by

我的数据库表中有 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/

相关文章:

mysql - 如何连接到digitalocean mysql服务器

mysql - SQL 查询 - 从具有相同 ID 的多行中获取结果

php - 如何使用 SQL 进行松散搜索

c# - 从列表中选择<T>

php - 选择数组()

php - 需要有关使用 PHP 在 mysql 数据库中插入逗号分隔数据的帮助

mysql - cakePHP 时间戳字段未正确保存

选择查询和 'order by' 子句的 MySQL 问题

php - fatal error : Call to a member function prepare() on a non-object in pdo

mysql - 选择查询显示第一次和最后一次