web-dev-qa-db-fra.com

Mysql dans PHP - comment mettre à jour une seule ligne de la table mais avec le plus grand numéro d'identification

J'essaie de mettre à jour des champs dans ma base de données, mais je suis coincé avec un problème aussi simple: je veux mettre à jour une seule ligne de la table avec le plus grand numéro d'identification. Je ferais quelque chose comme ça:

UPDATE table SET name='test_name' WHERE id = max(id)

Malheureusement, cela ne fonctionne pas. Des idées?

Structure de la table

id | name
---|------
 1 | ghost
 2 | fox
 3 | ghost

Je souhaite mettre à jour uniquement la dernière ligne car le numéro d'identification est le plus important.

13
Kalreg

L'utilisation de MAX() n'est pas possible à cette position. Mais vous pouvez faire ceci:

UPDATE table SET name='test_name' ORDER BY id DESC LIMIT 1;
62
iblue
UPDATE table SET name='test_name' WHERE id = (SELECT max(id) FROM table) 

Cette requête renvoie une erreur car vous ne pouvez pas créer de sous-requête SELECT à partir de la même table que vous mettez à jour.

Essayez d'utiliser ceci:

UPDATE table SET name='test_name' WHERE id = (
    SELECT uid FROM (
        SELECT MAX(id) FROM table AS t
    ) AS tmp
)

Cela crée une table temporaire, ce qui permet d'utiliser la même table pour UPDATE et SELECT, mais au détriment des performances.

4
Bryn

Je pense que la méthode d'iblue est probablement votre meilleur choix. mais une autre solution pourrait être de définir le résultat en tant que variable, puis d'utiliser cette variable dans votre instruction UPDATE.

SET @max = (SELECT max(`id`) FROM `table`);
UPDATE `table` SET `name` = "FOO" WHERE `id` = @max;

Cela pourrait s'avérer utile si vous envisagez d'exécuter plusieurs requêtes avec le même ID, mais ce n'est pas vraiment idéal d'exécuter deux requêtes si vous effectuez une seule opération de mise à jour.

4
Lachlan McD.
UPDATE table_NAME
SET COLUMN_NAME='COLUMN_VALUE' 
ORDER BY ID 
DESC LIMIT 1;

Parce que vous ne pouvez pas utiliser SELECT IN DELETE OR UPDATE CLAUSE.ORDER BY ID DESC LIMIT 1. Cela vous donne des identifiants ayant la valeur maximale MAX(ID) comme vous avez essayé de le faire. Mais MAX(ID) ne fonctionnera pas.

1
Yanks

Ancienne question, mais pour tous ceux qui y croiseront, vous pourrez peut-être le faire:

UPDATE
     `table_name` a
JOIN (SELECT MAX(`id`) AS `maxid` FROM `table_name`) b ON (b.`maxid` = a.`id`)
SET a.`name` = 'test_name';
1
WaveTyler

Nous pouvons mettre à jour l’enregistrement en utilisant max () function et peut-être que cela vous aidera.

 UPDATE MainTable
 SET [Date] = GETDATE()
 where [ID] = (SELECT MAX([ID]) FROM MainTable)

Cela fonctionnera le parfait pour moi.

0
kishan Radadiya