【问题标题】:display last 2 entries in each category from a mysql table显示 mysql 表中每个类别的最后 2 个条目
【发布时间】:2014-11-18 14:27:50
【问题描述】:

我有一张如下表

===============================================
id          |      category    |    names     |
===============================================
1           |          A       |    name1     |
2           |          A       |    name2     |
3           |          A       |    name3     |
4           |          B       |    name4     |
5           |          B       |    name5     |
6           |          B       |    name6     |
7           |          B       |    name7     |
8           |          C       |    name8     |

预期输出:name8,name7,name6,name3,name2

我希望在每个类别中显示最后 2 个条目,这可能吗? 有人请帮助我。提前致谢。

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:
    $query =   SELECT * from table_name Order By id DESC limit 2;
    

    通过使用ORDER BY ... DESC,它将按降序从表中选择数据。

    // execute query 
    while () // fetch rows
    {
        $name_arr[] = $row['names']; 
    }
    
    $output = implode(",", $name_arr);
    echo $ouput;
    

    【讨论】:

    • 看看预期的输出。此查询将给出输出 name8, name7
    • @JominGeorge 我认为这对你有用。有什么不正确的请说.....?
    • 感谢您的努力,但这是不正确的。您的查询将仅显示最后两个名称。不要以为我是个傻瓜,我现在才加入 stackoverflow,这说明我的声誉为什么低。 :D 希望你能理解。 ;)
    • 我写了一个查询,只为每个类别选择最后一行而不是两行。
    • @JominGeorge:我没有说你像傻瓜一样,或者没有说你的名誉亲爱的。我明白我的回答是错误的。所以只是问了更多关于我做错了什么。
    【解决方案2】:

    它又快又脏,但这可能会奏效。

    select
        cats.category,
        (select 
            a.id 
            from yourTable a 
            where a.category=cats.category 
            order by a.id desc limit 1,1) as SecondLast,
        (select 
            a.id 
            from yourTable a 
            where a.category=cats.category 
            order by a.id desc limit 0,1) as Last,
    from
    (select distinct category from yourTable) cats
    

    不过,它会在一行中返回最后两条记录。

    如果您想同时使用 PHP 和 SQL,这将变得相当简单:

    <?php
        $sql="select distinct category from yourTable";
        // stuff to run this query first.
        // Output placed into array called $array
        foreach($array as $cat)
        {
            $sql="select id, category, names from yourTable where category='$cat' oder by id desc limit 2";
            // Do stuff here to run this inner query.
            // Append results into array $finalArray
            $finalArray[]=$result;
        }
    
        print_r($finalArray);
    ?>
    

    【讨论】:

      【解决方案3】:

      这些类型的结果最好由其他 RDBMS 中的窗口函数处理,但不幸的是 Mysql 没有任何窗口函数,因此作为替代方案,有一种解决方案是使用用户定义的变量来为属于同一组的行分配排名

      SELECT  `id`, `category`, `names`
      FROM (
      SELECT *,
      @r:= CASE WHEN @g = category THEN @r + 1 ELSE 1 END rownum,
      @g:=category
      FROM test
        CROSS JOIN(SELECT @g:=NULL ,@r:=0) t
        ORDER BY category,id desc
      ) c
      WHERE c.rownum <=2 
      

      以上查询将为每个类别提供 2 条最近记录(基于 id)您可以使用 where 子句将查询的最后一部分更改为任意数字以显示每组 n 个结果,例如显示 3 条记录然后 WHERE c.rownum &lt;= 3 和以此类推

      Demo

      【讨论】:

      • 感谢@MKhalidJunaid。这个对我有用。非常感谢:)
      猜你喜欢
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 2014-10-13
      • 1970-01-01
      相关资源
      最近更新 更多