2010-06-07 5 views
7

Salut j'ai tables comme ceci:MISE À JOUR MYSQL avec IN et des sous-requêtes

entrée de la table:

id | nombre_commentaires
_____________________
1 | 0
2 | 0
3 | 0
4 | 0

commentaires de table:

id | eid | commenter
_____________________
1 | 1 | commenter sdfd
2 | 1 | essais de tests
3 | 1 | nombre de commentaire
4 | 2 | commentaire factice
5 | 2 | exemple de commentaire
6 | 1 | fg FGH DFH

Recherche i écrire:

UPDATE entry 
    SET total_comments = total_comments + 1 
WHERE id IN (SELECT eid 
       FROM comments 
       WHERE id IN (1,2,3,4,5,6)) 

Résultats que je reçois est:

entrée de la table:

id | nombre_commentaires
_____________________
1 | 1
2 | 1
3 | 0
4 | 0

Résultats attendus:

entrée de la table:

id | nombre_commentaires
_____________________
1 | 4
2 | 2
3 | 0
4 | 0

Toute aide sera appréciée.

Répondre

14

Utilisation:

UPDATE entry 
    SET total_comments = (SELECT COUNT(*) 
          FROM COMMENTS c 
          WHERE c.eid = id 
         GROUP BY c.eid) 
WHERE id IN (SELECT eid 
       FROM comments 
       WHERE id IN (1,2,3,4,5,6)) 
+0

ouais je cherche quelque chose comme ça ... mon motif est d'exécuter la requête de mise à jour basée sur la sous-requête .... sa mise à jour "total_comments" dans "entrée" table avec acutal nombre de commentaires, id dans « l'entrée » si j'Exécuter la requête que je l'ai indiqué, il ajoute que 1 pour tout nombre de commentaires trouvés dans subqery Voici ce que la requête SQL se transforme en après l'exécution des sous-requêtes. entrée MISE à JOUR SET total_comments = total_comments + 1 WHERE id IN (1,1,1,2,2,1) donc la mise à jour s'exécute une seule fois pour les ID 1 et 2 dans la table d'entrée. Coz c'est comment fonctionne IN. Mais je veux un peu comment l'exécuter 4 fois pour 1 et 2 fois pour 2. – Johal

+0

La seule façon dont je pense est d'exécuter quelque chose sous-requête comme ce que je ne sais pas comment faire: UPDATE entrée SET total_comments = total_comments + @count WHERE id IN (SELECT eid, count (*) comme @count des commentaires WHERE id IN (1,2,3,4,5,6)) mais ne marche pas dans le travail coz de plusieurs lignes et aussi je ne sais pas comment faire référence à @count dans l'état défini :( – Johal

1

C'est exactement ce à quoi je m'attendais. L'identifiant est IN dans l'ensemble que vous lui donnez, donc total_comments = total_comments + 1.

Il ne va pas en ajouter un pour chaque instance de la même valeur: ce n'est pas comme ça que fonctionne IN. IN retournera un simple booléen oui/non.

+0

je sais ... mais je veux une méthode afin que je puisse compter le nombre de entry.id dans subqery. Je peux le faire en exécutant la sous-requête sperate et en exécutant la requête de mise à jour en utilisant la boucle for pour tous ceux-là. Mais je veux le faire dans une requête c'est mon problème :( – Johal

1

Essayez:

UPDATE entry 
    SET total_comments = (SELECT COUNT(*) 
         FROM comments 
         WHERE entry.id = comments.eid 
         GROUP BY id) 
+0

cela fonctionnera pour tous les enregistrements dans la table d'entrée mais je veux courir pour les disques spécifiés seulement c'est pourquoi j'ai employé la clause IN ... – Johal

3

Si vous avez vraiment besoin total_comments dans une table séparée, je ferais qu'une vision. De cette façon, vous évitez la tâche de maintenance de la mise à jour de la table total_comments en entier.

+0

+1: Je suis complètement d'accord, ceci –

0
UPDATE entry e 
    SET total_comments = (SELECT COUNT(*) FROM comments WHERE eid = e.id) 
    WHERE 
    e.id in (SELECT eid FROM comments WHERE id IN (1,2,3,4,5,6))