【问题标题】:Labeling the top 3 entries标记前 3 个条目
【发布时间】:2013-06-10 18:19:36
【问题描述】:

我的问题是找出如何根据列“avg_score”在表格中标记前 3 个条目,同时仍显示其余条目,但没有标签。假设我有一个这样的表格:

 Entry   avg_score

entry_1 | 4.3
entry_2 | 9.4
entry_3 | 4.6
entry_4 | 7.1
entry_5 | 2.1
entry_6 | 1.9

我希望能够根据“avg_score”列找到前 3 名并将其显示为:

“第一名:entry_2

第二名:entry_4

第三名:entry_3

entry_1

entry_5

entry_6"

任何帮助将不胜感激!

【问题讨论】:

    标签: php mysql sql labeling


    【解决方案1】:

    执行此操作的规范方法是定义排名,然后使用排名来确定要添加到条目名称之前的字符串:

    select concat(case when rank = 1 then '1st place: '
                       when rank = 2 then '2nd place: '
                       when rank = 3 then '3rd place: '
                       else ''
                  end, entry)
    from (select t.*, @rank := @rank + 1 as rank
          from t cross join (select @rank := 0) const
          order by avg_score desc
         ) t
    

    【讨论】:

    • 太棒了,那么我如何将所有这些放入单独的变量中以便能够自定义 php 中的所有内容?
    • @MikeKochendorfer 。 . .如果我正确理解了这个问题,只需使用子查询。它会有排名。
    【解决方案2】:

    首先,您必须进行查询,该查询将按 avg_score 降序排序。

    之后你可以这样做:

    <?
    $x = 1;
    while($row = mysql_fetch_array($q)){
        if($x < 4){
            echo $x.". place: ";
        }
        echo $row['Entry'];
    }
    ?>
    

    如果您希望它显示第一个等,请使用:

    <?
    $x = 1;
    while($row = mysql_fetch_array($q)){
        if($x == 1){echo "1st place: ";
        }elseif($x == 2){echo "2nd place: ";
        }elseif($x == 3){echo "3rd place: ";}
        echo $row['Entry']."<br />";
        $x++;
    }
    ?>
    

    【讨论】:

    • 这不起作用,它回显:“1.entry_2 1.entry_4 1.entry_3 1.entry_1 等。”
    • 换一行 echo $row['Entry']."
      ";然后添加 $x++;在下一行
    • 好的,完美!有什么办法可以让标签系统说“1st, 2nd, 3rd”而不是“1. 2. 3”。
    猜你喜欢
    • 2014-04-06
    • 2021-05-05
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多