php - 如何将排名中的下一行获取到 "rank of last id"?

标签 php mysql

创建表

CREATE TABLE goal_implement( id INT, percent INT ); 
INSERT INTO goal_implement VALUES 
  (1,10),
  (2,15),
  (3,20),
  (4,40),
  (5,50),
  (6,20);

查询

SELECT id, percent, FIND_IN_SET( percent, (
SELECT GROUP_CONCAT( percent
ORDER BY percent DESC ) 
FROM goal_implement )
) AS rank 
FROM goal_implement 
ORDER BY id DESC

结果

id  percent rank
6   20      3
5   50      1
4   40      2
3   20      3
2   15      5
1   10      6

我不知道如何获取最后一个 id 的下一个 row(rank) 例如:最后一个 id 的排名是 3!

想要结果

id  percent rank
4   40      2

最佳答案

为了解决您的问题,我们有两种语言可供选择:

  • Php 很简单 --> 不好玩。

  • MYSQL --> 您已经使用 Mysql 完成了部分工作,所以我以这种方式完成。

SQLFIDDLE : Demo

步骤:

  • 获取最后一个id的排名+获取所有百分比的字符串

    SELECT FIND_IN_SET( percent, (SELECT GROUP_CONCAT( percent ORDER BY percent DESC ) 
                          FROM goal_implement )) - 1 into @next_rank
    FROM goal_implement 
    ORDER BY id DESC
    LIMIT 1;
    
    SELECT GROUP_CONCAT( percent ORDER BY percent DESC ) 
    FROM goal_implement into @str_rank;
    

此代码将为您提供:

@next_rank       @str_rank
   2          50,40,20,20,15,10

让我们开始玩吧(pbm starting - Kappa):MYSQL 中没有任何 explode() 函数。

  • 获取 @str_rank 内与 @next_rank 相关的百分比>

我们可以用原生函数做的最好的事情是:

  • SELECT SUBSTRING_INDEX(@str_rank, ',', @next_rank);

  • 结果:50,40

但是我们'40'只有

--> 让我们找到/创建一个函数来提取 +1 和 -1 位置之间的字符串(Arman P。)

CREATE FUNCTION SPLIT_STRING(str VARCHAR(255), delim VARCHAR(12), pos INT)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),
   LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1),
   delim, '');

. SELECT SPLIT_STRING(@str_rank, ',', @next_rank) 到 @next_percentage;

这会将 '40' 存储在 @next_percentage

结果:(最终)

SELECT *, @next_rank as rank
FROM goal_implement 
WHERE percent = @next_percentage;

输出:

id  percent     rank
4     40         2

PHP 版本:

$Array_test 应该是你的查询返回的数组

<?php

$array_test = array(array(6,20,3), array(5,50,1), array(4,40,2), 
              array(3,20,3), array(2,15,5), array(1,10,6));


$next_rank = $array_test[0][2] - 1;

foreach($array_test as $row)
    if($row[2] == $next_rank)
    {
        print "<pre>";
        print_r($row);
        print "</pre>";
    }
?>

输出:

Array
(
[0] => 4
[1] => 40
[2] => 2
)

来源: Stackoverflow : Equivalent of explode

关于php - 如何将排名中的下一行获取到 "rank of last id"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30704760/

相关文章:

php - 使用 class.upload.php 将图像上传到 mysql DB。图像名称没有扩展名

php - 使用 Javascript 和 PHP 动态添加查询 XML 源的新表和行

忽略 PHP 7.3 SoapClient stream_context (verify_peer)

php - 如何根据多个纬度经度数据计算车辆行驶距离

php - 设计用于自动完成任务的调度程序的最灵活的方法是什么,并且实现起来也很实用?

php - Android 小部件在远程 View 更新时从模拟器中消失

php - 如何在 Laravel 5 中启用查询日志

c# - 我可以验证 mysql 架构而不逐行执行吗

javascript - 如何使用ajax请求将印地文字体从客户端传递到服务器

java - Android ArrayIndexOutOfBoundsException 向 mysql 插入行