쿼리조언 0 5 523

by 날아라! [MySQL] [2019.04.17 19:47:04]


안녕하세요.

이리저리 방법을 찾아보고 체크해봐도 어떤부분이 문제인지 몰라 질문좀드립니다.

쇼핑몰을 현재 개발중인데요.

실시간 무통장입금서비스를 연동중에 있습니다.

실시간으로 입금된 금액들을 조회해서 db에 인서트한후 주문내역과 실시간으로 입금된 금액, 입금자, 계좌번호등을 매칭시켜

일치하는 부분에 대해서는 주문번호를 업데이트 시켜주는 매칭작업을 하고있는데요.

실질적으로 값을 비교할 필드는 위에서 말씀드렸던 금액, 입금자, 계좌번호 밖에 없습니다.

주문내역 테이블/필드 : ordertbl, actnum(계좌번호), price(금액), payname(입금자)

실시간조회테이블 테이블/필드 : banktbl, actnumber(계좌번호), bprice(금액), baccname(입금자)

 

위정보를 바탕으로 루프를 돌리면

SELECT COUNT(C.price) AS price_cnt
     , COUNT(A.payname) AS name_cnt 
  FROM banktbl as A
  LEFT OUTER JOIN ordertbl C
    ON A.actnumber = C.actnum
   AND A.baccname = C.payname
   AND A.bprice = C.price
 WHERE A.actnumber = '1111122233333' 
   AND A.baccname = '홍길동'
   AND A.bprice = '1000'

SELECT COUNT(C.price) AS price_cnt
     , COUNT(A.payname) AS name_cnt 
  FROM banktbl as A
  LEFT OUTER JOIN ordertbl C
    ON A.actnumber = C.actnum
   AND A.baccname = C.payname
   AND A.bprice = C.price
 WHERE A.actnumber = '1111122233333' 
   AND A.baccname = '홍길동'
   AND A.bprice = '1000'

위 데이터처럼 노출이 되는데요.

실질적으로 실시간으로 금액을 입금한 사람은 홍길동입니다.

그런데 한번만 입금했으면 다행이지만 실수로 2번을 입금했을경우 비매칭처리가 되어야하는데요.

카운팅이 제가 원하는대로 되질 않네요.

제가 실수를 한것같은데 어느부분에서 잘못되었는지 알수가 없어 조언좀 부탁드립니다.

정신이 없다보니 질문도 횡설수설합니다. ㅡㅡ

 

 

 

 

by 마농 [2019.04.18 08:35:31]

이미 입금 테이블로부터 입금 정보를 가져오는 쿼리를 한 번 수행한 뒤
수행 결과를 루프 돌리면서 수행하는 것 같은데요.
그렇다면 은행입금 테이블을 다시 읽을 필요가 없죠.
주문 테이블만 단독으로 읽으면 될 것 같네요.
단 입금확인여부 조건 하나 더 추가하면 될 듯 하네요.
 

SELECT *
  FROM ordertbl
 WHERE actnumber = '1111122233333' 
   AND baccname  = '홍길동'
   AND bprice    = 1000
   AND status    = '입금전'
;

 


by 날아라! [2019.04.18 09:04:25]

답변감사합니다.

말씀대로 쿼리를 수정해서 테스트를 해보았습니다.

아래 쿼리처럼 결과가 나왔는데요

        SELECT *
          FROM banktbl
         WHERE actnumber = '1111122233333' 
           AND baccname = '홍길동'
           AND bprice = '210000'
        result : 180427184603279::262573

        SELECT *
          FROM banktbl
         WHERE actnumber = '1111122233333' 
           AND baccname = '홍길동'
           AND bprice = '1000'
        result : 190418075503542::262578

        SELECT *
          FROM banktbl
         WHERE actnumber = '1111122233333' 
           AND bkjukyo = '홍길동'
           AND bprice = '1000'
        result : 190418080202735::262578 (주문번호 :: 무통장고유값)

쿼리결과 3개중에 맨위에것은 고유값이 한개이기때문에 매칭성공으로 처리할수있으나

아래 2개는 주문번호는 다르고 고유값이 같은경우 비매칭(동명이인)이라고 처리를 하고싶은데요.

어떻게 처리를 해야될지 막막하네요. 조언좀 부탁드립니다.


by 마농 [2019.04.18 10:49:40]

결과가 다르니 구별이 가능할 듯 한데요? (정상:1건, 오류:2건)


by 날아라! [2019.04.18 11:09:14]

답변감사합니다.

제가 구현하고자 하는것은 아래2개의 주문번호는 다르고 고유값이 같은 각각의 주문번호에 비매칭(동명이인)이라는 값을 업데이트 하고싶습니다.

결과값은 위에처럼 노출되지만 이후에 업데이트하는부분에서 막혀 막막하네요 ㅡㅡ


by 마농 [2019.04.18 11:28:49]

글쎄요?
비매칭을 왜 업데이트하는지 모르겠네요?
매칭 되는 것만 매칭이라고 업데이트 해야 하는 거 아닌가요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입