我无法获取变量的排名值并将其更新为列。基本上我的意思是下面我有一个代码从表“银行”中选择列“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     <b>Bank Balance:</b> $userinfo->bankbalance </br>";
}
答案 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 演示