获取表格中每个类别的前N个结果

时间:2014-07-06 18:36:10

标签: mysql

我希望提取表格中某个类别的前10个结果,按日期排序。我的表看起来像

CREATE TABLE IF NOT EXISTS Table
( name VARCHAR(50)
, category VARCHAR(50)
, date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

到目前为止,我已经提出了SELECT category FROM Table GROUP BY category;,这将为我提供商店中的每个类别。

接下来,我需要在第一条指令送给我的每个SELECT * FROM Table WHERE category=$categ ORDER BY date DESC LIMIT 10;的某种foreach循环中运行$categ

如果可能的话,我想在MySQL中完成所有这些工作;我在网上遇到了几个答案,但它们似乎都涉及两个或更多的表格,或者提供难以理解的难题......我觉得可以在服务器中处理这么简单的事情似乎很愚蠢代码(除了不必要的类别名称存储之外,甚至不会产生那么大的开销)很难转化为SQL代码,但如果没有什么可行的,那么我最终会做什么,我想。

1 个答案:

答案 0 :(得分:1)

您可以使用内联视图和用户定义的变量来设置“行号”列,然后外部查询可以根据“行号”列进行过滤。 (这样做,我们可以模拟ROW_NUMBER分析函数。)

对于大型集合,这可能不是最有效的方法,但它适用于小集合。

外部查询看起来像这样:

SELECT q.*
  FROM ( 
         <view_query>
       ) q
 WHERE q.row_num <= 10 
 ORDER
    BY q.category, q.date DESC, q.name

视图查询将是这样的

         SELECT IF(@cat = t.category,@i := @i + 1, @i := 1) AS row_num
              , @cat := t.category AS category
              , t.date
              . t.name
           FROM mytable t
          CROSS
           JOIN ( SELECT @i := 0, @cat := NULL ) i 
          ORDER BY t.category, t.date DESC