2017-04-17 2 views
1

J'essaie de faire une mise à jour en utilisant une jointure interne avec limite et ordre par (bien que l'ordre par n'est pas essentiel.) D'après ce que j'ai lu, la mise à jour standard ne sera pas travail ... ce que je suis en train de faire:Mise à jour de MySQL en utilisant INNER JOIN avec ORDER BY et LIMIT

UPDATE table1 
INNER JOIN table2 
ON table1.service_id=table2.service_id 
SET table1.flags = NULL 
WHERE table1.type = 'fttc' 
AND table1.flags = 'co' 
AND table2.sync not like '%Yes%' 
AND table1.date >= $today_date 
ORDER BY table1.priority ASC 
LIMIT 20; 

il est destiné à être utilisé dans un outil de gestion des cas et en utilisant php, je veux mettre à jour 20 billets iE retirer le « drapeau » afin qu'ils puissent être travaillé, la quantité sera passée comme une variable, donc je veux mettre à jour 20 billets par exemple la plus haute «priorité» d'abord, si cela peut être fait?

+1

Si la commande par n'est pas important, la limite n'est ni l'une ni l'autre, n'est-ce pas? –

+2

La commande par dans une mise à jour n'a pas de sens. S'il vous plaît clarifier ce que vous voulez accomplir. Pourquoi utiliser la limite? –

+0

Vous n'avez pas reçu la question? Veuillez refactoriser la question. – Biswabid

Répondre

1

Il devrait y avoir aucune raison d'utiliser une vue:

UPDATE table1 t1 
    SET t1.flags = NULL 
    WHERE t1.type = 'fttc' AND 
      t1.flags = 'co' AND 
      t1.date >= $today_date AND 
      EXISTS (SELECT 1 
        FROM table2 t2 
        WHERE t2.service_id = t1.service_id AND 
         t2.sync not like '%Yes%' 
       ) 
    ORDER BY t1.priority ASC 
    LIMIT 20; 

Vous ne pouvez pas utiliser ORDER BY et LIMIT avec une table multiple JOIN. Toutefois, vous pouvez déplacer la condition sur table2 à la clause WHERE.

+0

sur le point de tester cette façon de faire, pouvez-vous confirmer ce que la valeur '1' représente à la table SELECT 1 FROM? Merci – djd

+0

Cela fait exactement ce dont j'ai besoin. Je vous remercie. – djd

+0

@djd. . . 'EXISTS' vérifie si des * lignes * sont renvoyées. Le '1' est une valeur arbitraire facile à taper. –

3

Si je lis votre question correctement, vous voulez perfor m une mise à jour sur les 20 premiers enregistrements qui résulte de la jointure, en utilisant la priorité comme ordre. Vous ne pouvez pas le faire directement dans un UPDATE dans MySQL AFAIK, mais vous pouvez créer une vue pouvant être mise à jour, puis la mettre à jour.

CREATE VIEW yourView 
AS 
SELECT 
    t1.service_id, 
    t2.service_id, 
    t1.flags, 
    t1.type, 
    t1.date, 
    t1.priority, 
    t2.sync 
FROM table1 t1 
INNER JOIN table2 t2 
    ON t1.service_id = t2.service_id 
WHERE t1.type = 'fttc'   AND 
     t1.flags = 'co'   AND 
     t2.sync NOT LIKE '%Yes%' AND 
     t1.date >= $today_date 
ORDER BY t1.priority 
LIMIT 20; 

Et puis mettre à jour ce point de vue:

UPDATE yourView 
SET flags = NULL 
+1

Je n'aurais jamais pensé à le faire de cette façon, ça marchera, merci. Je savais que cela ne pouvait pas se faire via une mise à jour standard - c'était une alternative que je recherchais :-) – djd

+1

Ceci est un peu l'analogie de MySQL à la mise à jour d'un CTE dans une autre base de données comme SQL Server. Gardez-le dans votre sac de trucs pour référence future. –