2017-10-04 4 views
2

J'ai rencontré un problème que je ne peux pas résoudre. Par exemple, j'ai la table avec les lignes, id, saison, épisode, ordre. Les données du tableau ressemble à:Mise à jour incorrecte avec jointure interne

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

Alors, quand je lance la requête SELECT sans UPDATE, ligne commande est triée absolument correctement

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

Mais quand j'utilise la même requête que la sous-requête de MISE A JOUR déclaration, elle ne trie pas de la même manière et définit des valeurs d'ordre différentes.

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

S'il vous plaît, expliquez-moi pourquoi cela se produit et comment le résoudre. Version MySQL:

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

Ce n'est pas votre requête réelle :-( – Strawberry

Répondre

1

Hmmm. Il semblerait que le order by n'affecte pas la variable. Je me demande si cela a changé dans les versions récentes de MySQL. Il a certainement l'habitude de travailler.

Dans tous les cas, vous pouvez le fixer à l'aide d'un sous-requête:

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

Il fonctionne comme supposé, je vous remercie Est-ce une sorte de bug MySQL! ou interprétation? –

+1

@RussellSk ... Dans mon expérience, les variables ne fonctionnaient pas correctement avec 'GROUP BY', et une sous-requête était nécessaire, mais les variables * travaillaient * - il était une fois - avec' ORDER BY' Cela semble avoir changé aussi, cela fait partie du moteur de traitement de requêtes amélioré de MySQL - il y a des choses plus importantes à optimiser que des variables. –