2017-10-04 36 views
2

我遇到了一個我無法解決的問題。 例如,我有與行,id,季節,情節,順序的表。在表 數據是這樣的:內部連接更新不正確

+--------+---------------+----------------+--------------+ 
| 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 | 
+--------+---------------+----------------+--------------+ 

所以,當我跑不UPDATE SELECT查詢,行順序是絕對正確排序

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'工作,並且需要一個子查詢,但變量* did *曾經工作 - 用'ORDER BY'這似乎也發生了變化,這是MySQL改進的查詢處理引擎的一部分 - 與變量相比,有更重要的事情要優化。 –