2016-05-31 3 views
-1

inv에는 ID, numstate의 3 개의 열이 있습니다.
state의 값은 0 = 사용되지 않음, 1 = 사용됨, 2 = 예약 됨입니다.mySQL : 하나의 쿼리에서 SELECT 및 UPDATE를 처리합니까?

SELECT num FROM inv WHERE state = 0 

쿼리가 내가 기록을 업데이트해야하고 예약 된 2 =로 state를 설정 한 num를 반환
다음 사용하지 않는 num 내가이 쿼리를 사용 얻으려면.

UPDATE inv SET state = 2 Where ID = id 

나는 하나의 쿼리에서만이를 수행하는 방법을 알고 있지만 어떻게해야합니까?

어떤 도움이 대답은 감사

편집 :

내가 이것을 실현하려 노력하고 있어요 :

I 고유 번호 송장을 생성해야합니다. 그래서 다음 free, unused number whith state = 0을 가져온 다음이 숫자를 반환하고 같은 쿼리에서 반환 된 레코드를 state = 2로 설정하므로 아무도 다른 레코드를 사용하지 않습니다. 나중에 완벽한 인보이스 생성에 성공하면이 레코드를 상태 = 1 (사용됨)로 업데이트합니다. 인보이스를 완벽하게 생성 할 수없는 경우에는 상태를 0 = 사용하지 않음으로 다시 설정합니다.

희망을 좀 더 명확하게 표현할 수 있기를 바랍니다.

+0

왜 사용하지 (WHERE 상태 = 0 inv_2에서 ID를 선택)? 그것은 훨씬 쉬울 수 있습니다. 당신은 찾을 수 있습니다 [여기] (http://stackoverflow.com/questions/5528854/usage-of-mysqls-if-exists) 또는 where 절에 포함시키지 않는 이유. – bipartite

+1

가장 좋은 방법은 num을 가져 와서 업데이트하고 반환하는 저장 프로 시저를 사용하는 것입니다.하지만 경쟁 조건도 따라야하므로 동시성에주의해야합니다. 데이터베이스의 현재 상태보다는 해결하려고하는 문제에 대해 설명하는 것이 더 나을 것입니다. –

+0

위의 수정 사항을 참조하십시오. -1 무엇을 위해? – Ben

답변

-1

이 방법이 효과가 있습니까?

UPDATE inv SET state = 2 Where ID IN (SELECT id FROM inv WHERE state = 0) 
+0

당신은 단지'UPDATE inv SET state = 2 WHERE state = 0'을 할 수도 있습니다. 나는 OP가 첫 번째 쿼리에서 첫 번째로 반환 된 행을 선택하고 두 번째에서이를 업데이트한다고 확신합니다. –

+0

아, 물론 간단합니다. 그의 문제를 올바르게 이해한다면 OP가해야 할 일이다. – hashbrown

+0

그래,하지만 아마 그렇지 않을거야. 그 질문은 분명하지 않지만, 나는 그가 * 기록을 갱신하기를 원한다고 확신한다. –

0
update inv a join (select num from inv where state= 0) b on a.id = b.id 
SET state = 2; 
+0

'b'는'id' 열이 없을뿐만 아니라 잘못되었습니다. @ hashbrown의 답변에 대한 내 의견을 참조하십시오. –

+0

귀하의 제안에 따라 원래의 질문이 해결 될 수도 있지만 귀하의 제안이 문제를 해결하는 방법에 대한 몇 가지 설명은 OP와 다른 응답자의 통찰력 향상에 도움이 될 수 있습니다. – rpy

2

업데이트 INV 세트 상태에서 ID = 2 (INV로부터 ID를 선택 상태 = 0 1 제한);

다음 단일 숫자 값을 가져 와서 예약 됨으로 업데이트합니다.

업데이트 답 : 주어진 잘못된 답변

나의 사과 위의 질의 인해 제한 절에 작동하지 않습니다 말했다 이후는 MySQL은 하위 쿼리으로 사용이 제한됩니다.

update inv a join (select id, num from inv where state=0 limit 1) b 
on a.id = b.id SET state=2; 

이 쿼리는 샘플 데이터가 확인되었습니다

그래서 내가 여기 주어진 답변과 유사한 또 다른 접근 방식을 제안 하였다.

+2

이것은 분명히 현재의 형태로 질문에 대답합니다. 이제 개인적으로 제안하지 않은 이유는 5 달러를 내기 때문에 어떤 코드가 업데이트되었는지를 확인하고이를 호출 코드로 반환하기 때문입니다. 하지만 아마도 너무 많이 읽고 있어요 : - P –

+0

FALSE를 반환합니다. 또한 진술서에서 번호를 반환합니까? – Ben

+0

조인 피연산자 대신 select 쿼리는 ID를 반환하고 해당 ID를 기반으로 상태 열이 즉시 업데이트됩니다. 이것은 단일 라인 쿼리에서 얻을 수있는 것입니다. 무엇을하고 싶거나, 번호를 업데이트하거나 가져오고 싶으십니까? –

1

이 시도;

SET @num = null; 
SET @id = null; 
SELECT id into @id FROM inv WHERE state = 0 LIMIT 1; 
SELECT num into @num FROM inv WHERE id = @id; 

PREPARE stmt FROM 'UPDATE inv SET state = 2 Where ID = ?' USING @id; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SELECT @num; 
+0

어떻게 이것을 PDO로 표현 하시겠습니까? – Ben

-1
SELECT num FROM inv WHERE state = 0  
UPDATE inv SET state = 2 Where ID = id 

그냥 사용)
업데이트 INV의 SET 상태 = 상태 = 0

하나 sintax에 대상으로 두 번 테이블을 정의 할 수 없습니다 2 하지만 2 테이블로 수행 할 수 있습니다.
SELECT num FROM inv = 0

UPDATE inv_1의 SET 상태 = 2 WHERE ID = "존재하는 경우"

관련 문제