2016-09-13 1 views
0

여기 내 results MySQL의 테이블의 샘플은 = 앞으로 때문에 최대 날짜의 날짜를 모두 이동 그 사용자에 대한 가장 높은 날짜가 현재 시간 소인이됩니다.MySQL은 :</p> <p><a href="https://i.stack.imgur.com/9N7hj.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/9N7hj.png" alt="enter image description here"></a></p> <p>내가 같은 간격으로 특정 사용자에 대한 앞으로의 모든 날짜를 이동하고 싶습니다 : 지금

/* result is 823 */ 
SELECT DATEDIFF(
    CURDATE(), 
    (SELECT MAX(r.`LastReviewed`) 
    FROM `results` r 
    WHERE r.`UserID` = 1) 
) 

하지만 앞으로 날짜를 이동할 것보다 쿼리에서 해당 정보를 사용하는 방법을 모른다 : 나는 일의 간격을 얻는 방법을 알고있다. 나는 시도했다 :

UPDATE `results` r 
SET r.`LastReviewed` = 
     r.`LastReviewed` + 
     INTERVAL (
      SELECT DATEDIFF(
       CURDATE(), 
       (SELECT MAX(r.`LastReviewed`) 
       FROM `results` r 
       WHERE r.`UserID` = 1) 
      ) 
     ) DAY 
WHERE r.`UserID` = 1 

그러나이 오류 :

오류 코드 1093

: 당신은 FROM 절

2 문제에서 업데이트 대상 테이블 'R'을 지정할 수 없습니다 그것이 효과가 있더라도 최대 기록이 하루가 끝날 때 (오후 11시 59 분)에 발생하면 최대 기록을 미래로 이동시킬 위험이 있습니다. 나는

SQL Fiddle

+0

당신은 하나의 쿼리를 수행 할 수 없습니다. 최대 값을 얻으려면 하위 쿼리가 필요하지만 업데이트하려는 테이블에서 읽는 것입니다. 2 단계로 수행하십시오. 최대 값을 가져온 다음 별도의 업데이트를 위해 최대 값을 사용하십시오. –

+0

@MarcB 안녕하세요. Marc. 나는 그 논리에 문제가있다. 하위 쿼리는 슈퍼 쿼리에 종속되지 않으므로 왜 중요합니까? 하위 쿼리가 실행되고 먼저 완료되지 않았습니까? – BeetleJuice

+0

그렇습니다. 당신은'update results ... (select from ... results)'를 가지고있다. 그래서 당신은 당신이 업데이트 대상으로 삼고있는 테이블에서 선택하고 있습니다. mysql은 단순히 이것을 허용하지 않는다. 유일하게 허용 가능한 해결 방법은 하위 쿼리 대신에'join'을 사용하는 것입니다. 하지만 집계 함수를 수행해야하므로 잘 작동하지 않습니다. –

답변

2

당신은 두 개의 연속 된 문장으로 그것을 할 수있는 현재의 날짜를 할 새 최대 싶습니다.

SELECT @offset := DATEDIFF(
    CURDATE(), 
    (SELECT MAX(LastReviewed) 
    FROM results 
    WHERE UserID = 1) 
); 
UPDATE results 
    SET LastReviewed = LastReviewed + INTERVAL @offset DAY 
WHERE UserID = 1; 

편집 아, 어, 모두를 위해 그것을 할 수 있나요? 임시 테이블을 사용합시다. (이 사람들은 다 끝내면 사라집니다.)

CREATE TEMPORARY TABLE offsets 
SELECT DATEDIFF(CURDATE(),MAX(LastReviewed)) offset, 
     UserId 
    FROM results 
    GROUP BY UserId; 

UPDATE results 
    JOIN offsets ON results.UserId = offsets.UserId 
    SET results.LastReviewed = results.LastReviewed + INTERVAL offsets.offset DAY; 

임시 테이블에는 각 사용자에 대해 하나의 행이 있습니다. 테이블을 갱신하는 갱신 명령문에서 요약 조회 (사용자의 경우 MAX())를 수행 할 수 없다는 제한 사항을 극복합니다.

+0

고맙습니다. 두 번째 쿼리에서 DB는'r' 테이블이 어떤 테이블인지를 알 수 있습니까? – BeetleJuice

+0

Ooops, typo. 두 번째 쿼리에는 테이블 이름이 필요합니다. –

+0

+1 개발자의 샌드 박스 데이터베이스에서 테스트 데이터를 만들 때 나는 똑같은 일을합니다. 그것은 두 단계로 이루어져야합니다. –