아이템 번호 | 가격 |
1000 | 1000 |
1001 | 1500 |
1002 | 2000 |
유저ID | 레벨 | 보유 금화 | 주 장비 | 보조 장비 | 보조 장비 인벤 | 소모품 인벤 |
0 | 10 | 2000 | 1000 | 2000 | 2001 | 3000 |
1 | 23 | 1500 | 1001 | 2005 | 2007 | |
2 | 15 | 3250 |
이렇게 아이템 상점 테이블과 유저 정보 테이블이 있는 상태에서 아이템 번호를 입력하면 가격을 알아내서 유저 금화에서 삭제하고 입력한 아이템 각 아이템 번호를 주장비나 보조장비 인벤 또는 소모품 인벤에 3곳에 갱신는 쿼리를 저장 프로시저로 생성하려고 합니다.
근데 아이템 번호와 가격을 입력하고 유저 정보를 입력하면 유저 id로 유저를 구분해서 보유한 금화를 차감하는 것까진 조건을 넣어서 쿼리를 짜는데 아이템을 주 장비나 보조 장비등 각 테이블로 어떻게 구분해서 갱신을 시킬지 막막합니다.
CREATE Procedure STORE_BUY
@search_item_idx int, -- 상점 아이템 인덱스
@search_item_pay int, -- 아이템 가격
@search_user_idx int -- 사려는 유저 ID
AS
IF EXISTS(select SHOP_PAY = @search_item_pay from 아이템상점 WHERE(아이템번소= @search_item_idx))
UPDATE 유저 정보
SET 보유금화 = 보유금화 - ISNULL((select 가격 from 아이템상점 WHERE (아이템번호= @search_item_idx)), 0)
WHERE 유저ID = @search_user_idx
유저의 보유 금화를 차감시키는 쿼리는 이렇게 짰는데 조건에 따라 다른 열에 갱신시키는 건 어떻게 해야할까요? 아이템 번호를 1000번대는 주장비, 2000번대는 보조장비 인벤 3000번대는 소모품 인벤으로 나눠서 그 값보다 크거나 작으면 각 테이블에 갱신시키는 것으로 생각하고 있습니다.
Comment 2
-
카즈야마(이정우)
2014.02.14 11:50
-
사이드사이드
2014.02.14 16:49
카즈야마님//감사합니다. if로만 생각했었는데 case로도 조건을 만족시켜 줄 수 있었군요! 친절한 설명 감사드립니다. 그리고 보유금화 차감에서 select 부분은 ISNULL((select 가격 from 아이템상점 WHERE (아이템번호= @search_item_idx)), 0)<-이부분 말씀하시는 것 맞으시죠? 아이템 가격이 들어오지 않았을 때 0 값을 받게 하고 싶어서 아이템을 검색하게 했는데 쓰지 않아도 무방했었나 보내요ㅠㅠ제가 쿼리 배운지 얼마 안된지라ㅠㅠ 조언 감사합니다. 조언해주신대로 예외처리 잘 하겠습니다. 감사합니다.
안녕하세요.
일단 주장비, 보조장비등의 아이템이 단품으로만 관리되는지와
인벤토리 라는 개념이 없다는 가정으로 보이는데요.
개인적인 생각으로는 유저정보 와 아이템 정보는 분리 하시는게 좋다고 생각합니다.
일단 위의 쿼리를 일단 해결하시려면
IF 분기를 태우시셔도 되고, CASE 문등을 이용한 여러 방법이 있을거 같습니다.
IF = @search_item_idx >= 1000 AND @search_item_idx < 2000
BEGIN
UPDATE 유저 정보
SET 보유금화 = 보유금화 - ISNULL((select 가격 from 아이템상점 WHERE (아이템번호= @search_item_idx)), 0)
, 주장비 = @search_item_idx
WHERE 유저ID = @search_user_idx
END
ELSE IF = @search_item_idx >= 2000 AND @search_item_idx < 3000
BEGIN
UPDATE 유저 정보
SET 보유금화 = 보유금화 - ISNULL((select 가격 from 아이템상점 WHERE (아이템번호= @search_item_idx)), 0)
, 보조장비 = @search_item_idx
WHERE 유저ID = @search_user_idx
END
아니면....
UPDATE 유저 정보
SET 보유금화 = 보유금화 - ISNULL((select 가격 from 아이템상점 WHERE (아이템번호= @search_item_idx)), 0)
, 주장비 = CASE WHEN @search_item_idx >= 1000 AND @search_item_idx < 2000 THEN @search_item_idx ELSE 주장비 END
, 보조장비 = CASE WHEN @search_item_idx >= 2000 AND @search_item_idx < 3000 THEN @search_item_idx ELSE 보조장비 END
........
WHERE 유저ID = @search_user_idx
그리고 변수로 아이템 인덱스와 가격을 받는데
보유금화 차감에서 SELECT 를 더 하시는 이유가 있으신지....
금화 차감이나 아이템 지급 등은 상당한 이슈를 만들어 냅니다.
부디 예외처리 잘하셔서 나중에 문제되지 않길 바랍니다.