【问题标题】:Getting the $rank variable and updating it in the table获取 $rank 变量并在表中更新它
【发布时间】:2013-12-28 21:21:08
【问题描述】:

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

示例:排名第 1 的银行账户是 John Smith。我将如何编写代码以便更新表“银行”中约翰史密斯的“银行账户排名”列?我尝试使用 $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>"; 

}

【问题讨论】:

  • 你在哪里设置$id -> $updateinfo-&gt;bindParam(':id', $id, PDO::PARAM_INT);?应该是$sessionid
  • 是的,它应该是 $sessionid.. 这是一个错字,感谢您发现它。

标签: php mysql sql variables rank


【解决方案1】:

与其不断地用多个查询访问数据库,不如考虑像这样一次完成

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演示

或使用两个语句,利用用户变量和UPDATE 中的ORDER BY

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();

更新:使用您可以执行的子查询来实现等效于 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演示

【讨论】:

  • 嗨,彼得。感谢您的代码。一个快速的问题......当两个银行账户的余额相同时,它只是按字母顺序排列银行账户,而不是给它们两个相同的排名。示例:Ben 的银行余额为 400 美元。托尼的银行存款余额为 400 美元。代码将显示 Ben 排名为 1,Tony 排名为 2,即使他们的余额相同。我将如何设置它以显示它们都排在第 1 位?
  • @user3063143 不客气。查看更新的答案。
  • 嗨彼得感谢代码,如果两个银行余额具有相同的金额,它会正确更新显示两个银行账户具有相同的排名...剩下的一个问题是当我加载页面时,排名是仍然按字母顺序排列绑定的银行余额,而不是显示两个银行账户的排名 1。我怀疑这与我在首页上的 OP 中发布的代码有关,因为那是我用于显示页面的代码。 . 你能告诉我如何设置代码,以便它显示相同的绑定银行余额排名吗?提前致谢
猜你喜欢
  • 2016-10-07
  • 2015-03-26
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
相关资源
最近更新 更多