12
votes

Mise à jour MySQL avec et sous-requête

Bonjour, j'ai des tables comme ceci:

Entrée de table: P>

Id | Total_Comments
_____________________
1 | 0
2 | 0
3 | 0
4 | 0 P>

Table Commentaires: P>

ID | eid | Commentaire
_____________________
1 | 1 | Commentaire SDFD
2 | 1 | Test d'essais
3 | 1 | Texte de commentaire
4 | 2 | Commentaire Dummy
5 | 2 | Exemple de commentaire
6 | 1 | FG FGH DFH P>

Requête I Écrire: P>

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


0 commentaires

5 Réponses :


1
votes

C'est exactement ce que je m'attendais. L'identifiant est dans le jeu que vous le donnez, donc total_comments = total_comments + 1.

Il ne va pas y ajouter un pour chaque instance de la même valeur: ce n'est pas la façon dont les travaux sont en cours. En retournera un simple booléen oui / non.


1 commentaires

Je sais ... mais je veux une méthode pour que je puisse compter le nombre d'entrées.Id à sous-région. Je peux le faire en exécutant la sous-requier Spècher puis exécutant la requête de mise à jour en utilisant une boucle pour toutes les personnes. Mais je veux le faire dans une question qui est mon porblem :(



1
votes

Essayez:

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


1 commentaires

Cela fonctionnera pour tous les enregistrements dans la table d'entrée, mais je veux exécuter uniquement des enregistrements spécifiés, c'est pourquoi j'ai utilisé la clause ...



3
votes

Si vous avez vraiment besoin de TOTAL_COMMENTS dans une table séparée, je ferais une vue. XXX

De cette façon, vous évitez la tâche de maintenance de la mise à jour de la table totale_comments. < / p>


1 commentaires

+1: Je suis tout à fait d'accord, c'est un meilleur choix de conception que la structure de la table actuelle.



20
votes

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


2 commentaires

ouais je cherche quelque chose comme ça ... mon motivation est d'exécuter la requête de mise à jour basée sur la sous-requête ... c'est pour mettre à jour "Total_Comments" dans la table "Entrée" avec le nombre de commentaires acutals, pour ID dans "Entrée" si je Exécutez la requête que j'ai spécifiée que cela n'ajoute que 1 pour tous les numéros de commentaires trouvés dans Subqery. Ici, quelle requête SQL passe après des exécutions de sous-requête: Mettre à jour le jeu de saisie Total_Comments = Total_Comments + 1 où ID in (1,1,1,2,2,1) SO est une fois que la mise à jour ne fonctionne qu'une seule fois pour une table d'entrée 1 et 2. Coz sa comment en marche. Mais je veux savoir comment la conduire 4 fois pendant 1 et 2 fois pour 2.


La seule façon dont je pense est de courir sous-requête quelque chose comme ça que je ne sais pas comment faire: Mettre à jour l'entrée Set Total_Comments = TOTAL_COMMENTS + @COUNT Où identifiant (sélectionnez EID, compte (*) en tant que @Count de commentaires où ID IN ( 1,2,3,4,4,5,6)) Mais alors en ne fonctionne pas CoZ de plusieurs lignes et je ne sais pas aussi comment référer @Count en état de réglage :(



0
votes
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))

0 commentaires