2010-12-10 7 views
0

두 개의 테이블 "은행"과 "채권"이 있습니다. 각 사용자에게는 은행 기록이 있지만 0, 1 또는 그 이상의 채권 기록이있을 수 있습니다.MySQL 반환하는 행이 여러 개인 하위 쿼리로 필드 값 업데이트

"은행"테이블에 "현금"필드를 사용자가 보유 할 수있는 여러 채권의 이익으로 업데이트하는 스크립트를 작성하고 싶습니다. 이자는 "채권"테이블의 issuePrice * coupon 필드에 의해 계산됩니다. 그러나 사용자가 여러 채권을 보유 할 수 있으므로 각 채권마다이 작업을 수행해야합니다. 순간

는,이 같은 시도 :

$MySQL->db_Query("UPDATE bonds bo, bank ba SET 
     ba.cash = ROUND(ba.cash + (bo.issuePrice * bo.coupon), 2), 
     ba.earned = ROUND(ba.earned + (bo.issuePrice * bo.coupon), 2) 
    WHERE LOWER(ba.user) = LOWER(bo.holder) AND 
     LOWER(bo.holder) <> LOWER('Bank');"); 

을하지만 예상되는 결과를 제공하지 않습니다. 나는 2 개의 채권을 가진 사용자와 함께 시도했는데 두 채권 모두 500 개의이자를 주어야 했으므로 총 1000 개, 단지 1 채권 만있는 것처럼 500을 추가합니다. I (1000)의 계산 된 관심 500 관심 다른 하나 하나 개 결합을 설정하면 갑자기 ... 475

+2

변환 SELECT로 보내고 결과를 확인하십시오. –

답변

1

UPDATE 문이 각 사용자의 행을 정확히 한 번씩 업데이트하는 것이 좋습니다. 서브 쿼리는이 작업을 수행하는 가장 좋은 방법입니다, 조인 된 테이블로 구현 가장 효율적으로 :

UPDATE bank 
JOIN (SELECT LOWER(bonds.holder) as user, 
    SUM(bonds.issuePrice * bonds.coupon) as total 
    FROM bonds 
    WHERE LOWER(bonds.holder) != 'bank' 
    GROUP BY user 
) as increments ON increments.user = LOWER(bank.user) 
SET bank.cash = ROUND(bank.cash + increments.total, 2), 
    bank.earned = ROUND(bank.earned + increments.total, 2) 

(자세한 최적화를 들어, LOWER 및 ROUND 통화 아마 제거되어야하지만, 그것은 또 다른 토론입니다.)

+0

감사합니다. –

0

가장 straighforward 방법 부 선택을 사용하여 개별적으로 필드를 갱신하는 추가

UPDATE bank ba1 
SET ba1.cash = ba1.cash + (ROUND(SELECT SUM(bo.issuePrice * bo.coupon) 
       FROM bank ba2 JOIN bonds bo ON bo.user = ba2.user 
       WHERE ba2.user = ba1.user), 2) 
... 
+0

이 방법도 효과가 있지만 다른 쿼리는 더 쉽고 성능이 좋습니다. –

관련 문제