2017-10-04 37 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改进的查询处理引擎的一部分 - 与变量相比,有更重要的事情要优化。 –