2010-03-19 6 views
0

J'ai le type de SQL suivante:MySQL UPDATE O WH IN pour chaque valeur listée séparément?

UPDATE photo AS f 
    LEFT JOIN car AS c 
     ON f.car_id=c.car_id 
    SET f.photo_status=1 
    , c.photo_count=c.photo_count+1 
    WHERE f.photo_id IN ($ids) 

Fondamentalement, deux tables (car & photo) sont liés. La liste dans $ ids contient des identifiants de photo uniques, tels que (34, 87, 98, 12). Avec la requête, je la mise en l'état de chaque photo dans cette liste à « 1 » dans le tableau photo et incrémenter simultanément le nombre de photos dans le tableau car pour la voiture à portée de main.

Il fonctionne, mais il y a un hic: Parce que la liste peut contenir plusieurs photos ids qui se rapportent à la même voiture, la photo ne comptent plus que jamais s'incrémente une fois. Si la liste comprenait 10 photos associées à la même voiture, photo_count deviendrait 1 .... alors que j'aimerais l'incrémenter à 10.

Y a-t-il un moyen d'effectuer l'incrémentation pour chaque photo individuellement à travers le rejoindre, par opposition à MySQL overthinking pour moi?

j'espère que ce qui précède est logique. Merci.

Répondre

6

Vous pouvez le faire avec deux requêtes:

UPDATE car 
SET photo_count = photo_count + (
    SELECT count(*) 
    FROM photos 
    WHERE photo.car_id = car.car_id 
    AND photo_status = 0 
    AND photo_id IN ($ids) 
); 

UPDATE photo 
SET photo_status = 1 
WHERE photo_id IN ($ids); 
+0

Cela semble prometteur merci. Va le tester .... – Tom

+0

Merci, cela fonctionne et fait le travail, probablement le moyen le plus simple. – Tom

1

Ce que je pense que vous devriez faire:

mise à jour des tables en deux étapes. Réglez d'abord le statut sur 1 dans le tableau des photos, puis mettez à jour le compte (en utilisant les fonctions group by et count (...)) dans la table car.

EDIT Rétractée 'approche naïve', ne fonctionnera pas comme le dit correctement l'OP!

+0

Vous avez mal compris la question. $ ids contient plusieurs identifiants photo associés à différentes voitures en différentes quantités. Les ajouter à photo_count ne fonctionnera pas du tout. Deuxièmement, la requête peut être divisée en deux seulement en bouclant la deuxième requête, ce qui signifie que s'il y a 40 photos, il y aura 1 + 40 requêtes. – Tom

+0

Je vois ce que vous voulez dire par "Vous avez mal compris la question". et je suis d'accord .. Je n'ai pas compris que le nombre sera différent sur une base de voiture par voiture! Néanmoins, je pense que vous devriez envisager de le faire en deux étapes: mettre à jour (recalculer) le nombre d'images par voiture. J'aurais dû écrire 'mise à jour' pas ajouter, donc j'ai corrigé cela. – lexu

+0

Pas de soucis, merci de contribuer. – Tom