获取$ rank变量并在表中更新它

时间:2013-12-11 03:38:03

标签: php mysql sql variables rank

我无法获取变量的排名值并将其更新为列。基本上我的意思是下面我有一个代码从表“银行”中选择列“bankaccount”,我根据银行余额对银行账户进行排名。我如何根据每个帐户获得的评级来选择更新“bankaccountranking”列。

示例:排名第一的银行帐户是John Smith。我如何编写代码以便更新John Smith在“bank”表中的“bankaccount ranking”列?我尝试使用$ rank变量进行更新,但这不起作用。

以下是代码:(提前感谢):

$sessionid = $_SESSION['uid'];
$info = $conn->prepare("SELECT `bankaccount`,`bankbalance` FROM `bank` WHERE           id:id      ORDER BY `bankbalance` DESC");
$info ->bindParam(':id', $sessionid , PDO::PARAM_INT);
$info->execute();


 $rank = 0;


while ($userinfo = $info->fetchobject()) {
$rank++;
echo "<b>$rank</b> . $userinfo->bankaccount &nbsp&nbsp&nbsp <b>Bank                    Balance:</b>           $userinfo->bankbalance </br>"; 

}

1 个答案:

答案 0 :(得分:0)

不要经常使用多个查询来访问数据库,而是考虑像这样

一次执行
UPDATE bank t JOIN 
(
  SELECT id, bankaccount, 
  (
    SELECT COUNT(*)
      FROM bank
     WHERE id = b.id
       AND bankbalance > b.bankbalance
  ) + 1 rank
    FROM bank b
   WHERE id = 1
) s 
   ON t.id = s.id
  AND t.bankaccount = s.bankaccount
  SET t.bankaccountranking = rank;

这是 SQLFiddle 演示

或使用两个语句,利用ORDER BY

中的用户变量和UPDATE
SET @rnum = 0;
UPDATE bank
   SET bankaccountranking = (@rnum := @rnum + 1)
 WHERE id = 1
 ORDER BY bankbalance DESC;

这是 SQLFiddle 演示


现在php代码可能看起来像这样

$sessionid = $_SESSION['uid'];

$sql = "UPDATE bank t JOIN 
(
  SELECT id, bankaccount, 
  (
    SELECT COUNT(*)
      FROM bank
     WHERE id = b.id
       AND bankbalance > b.bankbalance
  ) + 1 rank
    FROM bank b
   WHERE id = :id
) s 
   ON t.id = s.id
  AND t.bankaccount = s.bankaccount
  SET t.bankaccountranking = rank;";

$stmt = $conn->prepare($sql);
$stmt->bindParam(':id', $sessionid , PDO::PARAM_INT);
$stmt->execute();

UPDATE:与您可以执行的子查询实现等效的DENSE_RANK()分析函数

UPDATE bank t JOIN 
(
  SELECT id, bankaccount, 
  (
    SELECT COUNT(DISTINCT bankbalance)
      FROM bank
     WHERE id = b.id
       AND bankbalance > b.bankbalance
  ) + 1 rank
    FROM bank b
   WHERE id = 1
) s 
   ON t.id = s.id
  AND t.bankaccount = s.bankaccount
  SET t.bankaccountranking = rank;

这是 SQLFiddle 演示

或使用用户(会话)变量

SET @r = 0, @b = NULL; 
UPDATE bank b JOIN
(
  SELECT id, bankaccount, @r := IF(@b = bankbalance, @r, @r + 1) rank, @b := bankbalance
    FROM bank
   WHERE id = 1
   ORDER BY bankbalance DESC
) s
    ON b.id = s.id
   AND b.bankaccount = s.bankaccount
   SET bankaccountranking = rank;

这是 SQLFiddle 演示