2017-10-04 6 views
2

해결할 수없는 문제가 발생했습니다. 예를 들어 행, ID, 시즌, 에피소드, 주문이있는 테이블이 있습니다. 같은 테이블에 데이터 보인다 : 나는 UPDATE없이 SELECT 쿼리를 실행할 때내부 조인을 사용한 잘못된 업데이트

+--------+---------------+----------------+--------------+ 
| id  |  season |  episode |  order | 
+--------+---------------+----------------+--------------+ 
| 153914 | 1    | 1    |   NULL | 
| 153915 | 1    | 3    |   NULL | 
| 153916 | 1    | 2    |   NULL | 
| 153919 | 1    | 3    |   NULL | 
| 153920 | 1    | 4    |   NULL | 
| 153921 | 1    | 3    |   NULL | 
+--------+---------------+----------------+--------------+ 

그래서, 행 순서가 절대적으로 제대로

SELECT id, season, episode, (@row:[email protected]+1) as order 
          FROM `shows`, (select @row:=0) as rc 
          WHERE `show_id`= 14670 
          ORDER BY CAST(season AS UNSIGNED) ASC, CAST(episode AS UNSIGNED) ASC 

+--------+--------+---------+--------+ 
| id  | season | episode | order | 
+--------+--------+---------+--------+ 
| 153914 | 1  | 1  |  1 | 
| 153916 | 1  | 2  |  2 | 
| 153915 | 1  | 3  |  3 | 
| 153919 | 1  | 3  |  4 | 
| 153921 | 1  | 3  |  5 | 
| 153920 | 1  | 4  |  6 | 
+--------+--------+---------+--------+ 

를 분류되어 있지만 나는 UPDATE의 하위 쿼리와 같은 쿼리를 사용하는 경우 명령문은 같은 방법으로 정렬하지 않고 다른 순서 값을 설정합니다.

UPDATE `shows` f 
JOIN 
(
    SELECT id, (@row:[email protected]+1) as rowOrder 
    FROM `shows` as Fl, (select @row:=0) as rc 
    WHERE Fl.`show_id` = 14670 
    ORDER BY Fl.season ASC, Fl.episode ASC 
) t 
ON t.id = f.id 
SET f.order = t.rowOrder 

mysql> SELECT id, season, episode, order FROM `shows` WHERE `show_id`=14670; 
+--------+--------+---------+--------+ 
| id  | season | episode | order | 
+--------+--------+---------+--------+ 
| 153914 | 1  | 1  |  1 | 
| 153915 | 1  | 3  |  2 | 
| 153916 | 1  | 2  |  3 | 
| 153919 | 1  | 3  |  4 | 
| 153920 | 1  | 4  |  5 | 
| 153921 | 1  | 3  |  6 | 
+--------+--------+---------+--------+ 

왜 그런지 어떻게 해결할 수 있는지 설명해주십시오. MySQL 버전 :

>mysql --version 
mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using EditLine wrapper 
+0

이가 예상대로 작동 – Strawberry

답변

1

흠. order by이 변수에 영향을 미치지 않는 것으로 보입니다. 최근 버전의 MySQL에서 이것이 변경되었는지 궁금합니다. 그것은 확실히 일하는 데 사용되었습니다.

어떤 경우

, 하위 쿼리 사용하여 문제를 해결할 수 있습니다!

UPDATE shows s JOIN 
     (SELECT id, (@row:[email protected]+1) as rowOrder 
     FROM (SELECT id, sea 
       FROM shows s2 
       WHERE s2.show_id = 14670 
       ORDER BY s2.season ASC, s2.episode ASC 
      ) s2 CROSS JOIN 
      (SELECT @row := 0) as rc 
     ) s3 
     ON s.id = s3.id 
    SET s.order = s3.rowOrder; 
+0

:-(실제 쿼리가 아닌 그것을 MySQL의 버그의 일종입니다 감사합니다 –

+1

@RussellSk ... 내 경험상 변수는 GROUP BY로 제대로 작동하지 않았고 하위 쿼리가 필요했지만 변수는 * 한 번에 'ORDER BY'로 작동했습니다. 이것은 MySQL의 개선 된 쿼리 처리 엔진의 일부입니다 - 변수보다 최적화하기 위해 더 중요한 것들이 있습니다. –