SELECT 후 결과 값 UPDATE 쿼리 질문입니다. 0 8 4,474

by visca구루비 [MySQL] MySQL SELECT UPDATE [2017.01.11 16:41:04]


안녕하세요.

 

SELECT 후에 UPDATE가 되는 쿼리를 만들고 있습니다.

 

UPDATE 
			winegraph.board_faq bf
			LEFT JOIN
			(
				SELECT bfOrder, bfSeq FROM winegraph.board_faq bf2
				WHERE bf2.bfOrder > bfOrder AND bf2.bfSeq != bfSeq
			) b
			ON bf.bfSeq = b.bfSeq
		SET
			bf.bfOrder = bfOrder + 1
		WHERE
			bf.bfSeq !=  bfSeq

이렇게 만들었는데

결과값이 2개가 나오는데 하나만 UPDATE처리를 해주고 있네요

어떻게 해야할지 모르겠습니다.ㅠㅠ

by jkson [2017.01.11 17:15:20]

mysql 구문은 잘모르지만.. bf만 update할 거라면 left join을 왜 하시는 거죠? inner join이라야 의미가 있을 것 같은데요. b에 값이 없으면 null + 1 이 되어서 최종적으로 null로 update하는 거 아닌가요?


by 마농 [2017.01.11 17:19:31]

쿼리가 이상한데요?
알리아스를 지정하지 않은 컬럼들이 이상하구요.
알리아스를 지정한다 하더라도 이상할 듯 합니다.
2건 조회된 SELECT 쿼리를 보여주세요.
 


by visca구루비 [2017.01.11 17:23:15]
UPDATE winegraph.board_faq AS t
JOIN
(
    SELECT @rownum:=@rownum+1 rownum, bfseq, bfOrder
    FROM winegraph.board_faq
    CROSS JOIN (select @rownum := 0) rn
    WHERE bfSeq != 8 AND bfOrder >= 7
) AS r 
ON t.bfSeq = r.bfSeq
SET t.bfOrder = r.rownum

일단 이런식으로 하고있었습니다.

update는 되는데

현재 bfSeq가 8이 아닌것들은 저장되어있는 bfOrder에 +1을 해줘야 하는데 rownum이 저장되는것 같더라구요


by 우리집아찌 [2017.01.11 17:21:08]

MY-SQL은 잘모르지만.. 일단 맨밑의 조건절에서 하나만 필터링 되는게 아닐까요?


by jkson [2017.01.11 17:25:06]

저는 더 잘 모르지만 저 쿼리로 update하진 않았을 듯요. bforder > bforder and bfseq != bfseq 면 값이 없는데.. 그런데 1개는 제대로 업데이트되었다니.. mysql은 신기한듯..


by 우리집아찌 [2017.01.11 17:56:47]

이상하긴한데 UPDATE 됐다니까...


by jkson [2017.01.11 17:29:18]

'현재 bfSeq가 8이 아닌것들은 저장되어있는 bfOrder에 +1을 해줘야 하는데' ->

update winegraph.board_faq
set bforder = bforder + 1
where bfseq != 8

이렇게 하면 안 되나요?


by 마농 [2017.01.11 17:54:38]

원본쿼리는 조회대상에 대해 1번부터 차례대로 갱신하는 거구요.
원본쿼리와는 전혀 다른 개념의 업데이트가 필요한 거네요.
전혀 다르게 접근하셔야죠.
그리고 사실 원본 쿼리 또한 셀프 조인이 필요 없을 듯하네요.
 

UPDATE winegraph.board_faq
   SET bfOrder = bfOrder + 1
 WHERE bfSeq   != 8
;

-- 원본 쿼리 셀프 조인 제거 --
UPDATE winegraph.board_faq t
 CROSS JOIN (SELECT @rownum := 0) r
   SET t.bfOrder = (@rownum := @rownum + 1)
 WHERE t.bfSeq   != 8
   AND t.bfOrder >= 7
;

 

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