2013-12-11 2 views
1

변수의 순위 값을 가져 와서 열로 업데이트하는 데 문제가 있습니다. 기본적으로 아래 뜻은 은행 "테이블"에서 "bankaccount"열을 선택하고 은행 잔고를 기반으로 은행 계좌 순위를 지정하는 코드입니다. 각 계좌의 등급에 따라 "은행 계좌 순위"항목을 업데이트하도록 선택하는 방법은 무엇입니까?

예 : 은행 계좌 1 위는 John Smith입니다. "bank"테이블에서 John Smith의 "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>"; 

}

+0

여기서'$ id' ->'$ updateinfo-> bindParam (': id', $ id, PDO :: PARAM_INT); 그것은'$ sessionid'일까요? – Sean

+0

예, $ sessionid가되어야합니다. 오타였습니다. 잡아 주셔서 감사합니다. – user3063143

답변

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 데모

가 또는 여기 UPDATE

SET @rnum = 0; 
UPDATE bank 
    SET bankaccountranking = (@rnum := @rnum + 1) 
WHERE id = 1 
ORDER BY bankbalance DESC; 

두 개의 문, 활용하여 사용자 변수 및 ORDER BYSQLFiddle 데모


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

,691,363처럼 보일 수있다

(210)

UPDATE : 당신이 여기

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; 

이다 할 수있는 하위 쿼리와 DENSE_RANK() 분석 기능의 상당을 구현하는 여기에 SQLFiddle 데모

+0

안녕하세요. 코드를 보내 주셔서 감사합니다. 빠른 질문 중 하나 ... 두 은행 계좌의 잔액이 같을 때 두 계좌에 같은 순위를 지정하는 대신 알파벳순으로 계좌를 순위 지정했습니다. 예 : 벤의 잔액은 $ 400입니다. 토니 은행 잔고는 400 달러입니다. Ben은 Ben이 1 위를 차지했고 Tony는 2 위를 차지했습니다. 어떻게하면 둘 다 1 위를 차지할 수 있도록 설정할 수 있습니까? – user3063143

+0

@ user3063143 정말 환영합니다. 업데이트 된 답변보기 – peterm

+0

안녕하세요 피터 코드에 대한 감사와 두 은행 잔고가 같은 금액을 가지고 있다면 같은 계급을 가지고 두 은행 계좌를 올바르게 표시 업데이 트 ...남은 한 가지 문제는 페이지를로드 할 때 순위가 여전히 알파벳 순서로 은행 계좌 모두에 대해 순위 1을 표시하는 대신 묶인 은행 잔고로 순위가 매겨진 것입니다.이 코드는 내 OP에 게시 된 코드와 관련이 있습니다. , 이후 디스플레이 페이지에 사용 된 코드가 ... 당신은 묶여 은행 잔고에 대해 동일한 순위를 표시하도록 코드를 설정하는 방법을 보여 주시겠습니까? 미리 감사드립니다. – user3063143

관련 문제