초보 개발자 mysql 쿼리 질문드립니다.
본문
예를 들어 mall_goods 란 테이블이 있다고 하고요.
mall_goodls 테이블이 다음과 같은 구조라고 가정하면요.
idx | mall_id | g_barcode | g_name | g_price
5 | mall01 | 575835 | 감자깡 | 900
4 | mall02 | 575811 | 새우깡 | 1500
3 | mall01 | 575857 | 고구마깡 | 800
2 | mall01 | 575843 | 양파깡 | 700
1 | mall02 | 575835 | 감자깡 | 500
mall_id 컬럼에 mall01 값을 가진 상점의 g_number를 기준으로 mall02값을 가진 상점에 g_number가 있으면 updatef를 하고 없으면 insert를 하려고 하거든요.
일주일째 헤매고 있는데 도저히 답이 안나와 질문드립니다. ㅠㅠ
답변 7
문제는 g_number가 어디에 존재하나요?
질문의 요지를 잘모르게네요 프래토님이 말한대로 저게 있는 지도 모르게고 전체 필드 내용이 있어야
대답 가능 할듯합니다
예를 들어 mall_goods 란 테이블이 있다고 하고요.
mall_goodls 테이블이 다음과 같은 구조라고 가정하면요.
idx | mall_id | g_barcode | g_name | g_price
5 | mall01 | 575835 | 감자깡 | 900
4 | mall02 | 575811 | 새우깡 | 1500
3 | mall01 | 575857 | 고구마깡 | 800
2 | mall01 | 575843 | 양파깡 | 700
1 | mall02 | 575835 | 감자깡 | 500
mall_id 컬럼에 mall01 값을 가진 상점의 g_barcode를 기준으로 mall02값을 가진 상점에 g_barcode가 있으면 mall01값을 가진 상점의 g_name, g_price를 mall02의 g_name, g_price에 update를 하고 없으면 mall01값을 가진 레코드를 mall_id의 값을 mall02로해서 모든값을 insert를 하려고 하거든요.
일주일째 헤매고 있는데 도저히 답이 안나와 질문드립니다. ㅠㅠ
두번째 질문
g_number => g_barcode 로 인식하면
mall_goodls 테이블이 다음과 같은 구조라고 가정하면요.
idx | mall_id | g_barcode | g_name | g_price
5 | mall01 | 575835 | 감자깡 | 900
4 | mall02 | 575811 | 새우깡 | 1500
3 | mall01 | 575857 | 고구마깡 | 800
2 | mall01 | 575843 | 양파깡 | 700
1 | mall02 | 575835 | 감자깡 | 500mall_id 컬럼에 mall01 값을 가진 상점의 g_barcode를 기준으로
mall_id 컬럼이 mall02값을 가진 상점에 g_barcode가 있으면
update를 하고 없으면 insert를 하려고 하거든요.
라는 질문으로 이해되는데
왜 update 또는 insert를 하는지
사전의 발생된 조건(트리거,이벤트) 가 무엇인가요?
단지 update / insert의 기준점없네요
즉, 어디를 업데이트 할것인지에 대한 대상이 누락되어있습니다.
질문을 다시올리셔서 이 문장은 삭제합니다.
mall_id와 g_barcode를 유니크로 설정하시고요.
alter table tablename add unique key uinq(mall_id, g_barcode)
INSERT INTO tablename (mall_id, g_barcode, g_name, g_price) VALUES ('mall01', '575835', '감자깡', 900)
ON DUPLICATE KEY UPDATE g_name = '감자깡', g_price = 900
이런 식으로 쿼리 작성하시면 됩니다.
디비 구조를 바꿔보시는건 힘든가요.
idx | mall_id | g_barcode
5 | mall01 | 575835
4 | mall02 | 575811
3 | mall01 | 575857
2 | mall01 | 575843
1 | mall02 | 575835
g_barcode | g_name | g_price
575835 | 감자깡 | 900
575811 | 새우깡 | 1500
575857 | 고구마깡 | 800
575843 | 양파깡 | 700
두테이블은 join을 사용하고 두번째 테이블의 바코드 기준으로 업데이트만 하면됩니다.
이게 안된다면 sql query로만 해결해야 하는건지 php코드를 써도 되는건지에따라 달라집니다.
mall_goodls 테이블이 다음과 같은 구조라고 가정하면요.
idx | mall_id | g_barcode | g_name | g_price
5 | mall01 | 575835 | 감자깡 | 900
4 | mall02 | 575811 | 새우깡 | 1500
3 | mall01 | 575857 | 고구마깡 | 800
2 | mall01 | 575843 | 양파깡 | 700
1 | mall02 | 575835 | 감자깡 | 500mall_id 컬럼에 mall01 값을 가진 상점의 g_barcode를 기준으로
mall_id 컬럼이 mall02값을 가진 상점에 g_barcode가 있으면
mall_id 컬럼의 값이 mall01인 Record의 g_name, g_price를
mall_id 컬럼이 mall02의 Record에 g_name, g_price에 update를 하고
g_barcode값이 없으면
mall_id값이 mall01값을 가진 레코드를mall_id의 값은 mall02로해서 동일 Record을
insert를 하려고 하거든요.
질문의 구분을 위해서 들여쓰기를 했습니다.
1. mall_id 컬럼의 mall01의 대상으로
mall_id 컬럼이 존재하는지 여부
2. update 대상인 insert 대상인지 판단
두가지 기준으로
표기해봤습니다.
select 'update' type, b.* from mall_goodls a, mall_goodls b
where (1)
and a.mall_id = 'mall01'
and b.mall_id = 'mall02'
and b.g_barcode = a.g_barcode
and a.idx <> b.idx
union all
select 'insert' type, (select max(idx)+1 from mall_goodls ) idx,
'mall02' mall_id, a.g_barcode, a.g_name, a.g_price
from mall_goodls a, mall_goodls b
where (1)
and a.mall_id = 'mall01'
and b.mall_id = 'mall02'
and b.g_barcode <> a.g_barcode
and a.idx <> b.idx
쿼리를 이런 패턴으로해서
idx 는 일단 max+1로 했으나
auto_increment 로 하면 해결될듯 하구요
위와같이 대상을 뽑아서 실제 대상일때
해당 구문을 수행하면 되지 않을까 싶네요
!-->