从我的帖子表中的每个类别中选择最后4行

时间:2016-03-20 09:31:07

标签: php mysql

我有一个博客应用程序的帖子表。

表格结构:

post_id  post_title  post_description category_id created_time status

我想从我的表格中选择每个类别的最后4个帖子。我怎么做。我使用的是mysql数据库。

2 个答案:

答案 0 :(得分:1)

您可以尝试以下查询:

我认为您的表名是 BLOG

SELECT
    t.post_title,
    t.post_description,
    t.category_id,
    t.created_time
FROM
    (
        SELECT
          *,
          IF (@prev = category_id ,@cn := @cn + 1 ,@cn := 0) SL,
          @prev := category_id
        FROM blog,(SELECT @cn := 0, @prev := 0) var
        ORDER BY category_id, created_time DESC
    ) t
WHERE   t.SL < 4;

SQL FIDDLE DEMO

注意:如果您想从每个类别中获取最新的5条记录,则只需更改以下行,如下所示:

WHERE t.SL < 5;

<强>解释

  1. 首先根据category id对行进行排序,以便行 属于同一类别的人保持在一起。
  2. 然后根据created_time DESC对此进行排序。
  3. 现在你有了一个结果集,其中行按照排序 category_idcreated_time DESC
  4. 现在分配一个标志值,表示相应的值 每个职类的职位。 (在这种情况下,这个标志值 SL0开始。如果您在同一类别下看到一行,那么 只需为其分配SL的下一个值。如果你看到一行 另一个类别(i.e. new category)然后重置值 SL0
  5. 执行上述操作后,您将最终获得行所在的结果 根据category_id和created_time DESC以及a进行排序 标志值(SL)在结果集中具有相应的位置。
  6. 现在,如果您过滤那些包含标志值(SL)的记录 如果此结果集中的值小于4,您将获得这些记录 它们属于每个类别中的前4条记录。
  7. 以下查询涵盖了步骤1 to 5(它是给定查询中的内部查询):

    SELECT
       *,
       IF (@prev = category_id ,@cn := @cn + 1 ,@cn := 0) SL,
       @prev := category_id
     FROM blog,(SELECT @cn := 0, @prev := 0) var
     ORDER BY category_id, created_time DESC;
    

    Demo of this query only

    请检查每行的SL值。我希望你能得到它。

答案 1 :(得分:0)

您可以使用NOT EXISTS()

var dict = values.AsRef()
    .Where(p => !string.IsNullOrEmpty(p.CustomSlug))
    .ToDictionary(p => p.CustomSlug, p => p.ManufacturerID);

我不知道每行的唯一性,我假设是post_id。如果它也是post_title / category_id ETC,那么将它添加到group by子句和关系条件