Actualización de MySQL con In y Subquery
-
24-10-2019 - |
Pregunta
Hola tengo tablas como esta:
Entrada de tabla:
ID | Total_comments
_____________________
1 | 0
2 | 0
3 | 0
4 | 0
Comentarios de la tabla:
ID | Eid | comentario
_____________________
1 | 1 | comentario sdfd
2 | 1 | prueba de prueba
3 | 1 | mensaje de texto
4 | 2 | comentario ficticio
5 | 2 | comentario de muestra
6 | 1 | FG FGH DFH
Consulta que escribo:
UPDATE entry
SET total_comments = total_comments + 1
WHERE id IN ( SELECT eid
FROM comments
WHERE id IN (1,2,3,4,5,6))
Los resultados que obtengo son:
Entrada de tabla:
ID | Total_comments
_____________________
1 | 1
2 | 1
3 | 0
4 | 0
Resultados previstos :
Entrada de tabla:
ID | Total_comments
_____________________
1 | 4
2 | 2
3 | 0
4 | 0
Cualquier ayuda será apreciada.
Solución
Usar:
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))
Otros consejos
Si realmente necesita Total_Comments en una tabla separada, lo haría una vista.
CREATE VIEW entry AS
SELECT id, COUNT(comments) AS total_comment
FROM comments
GROUP BY id
De esta manera, evita la tarea de mantenimiento de actualizar la tabla Total_Comments por completo.
Eso es exactamente lo que esperaría. La identificación está en el conjunto que le das, por lo que Total_comments = Total_comments + 1.
No va a agregar uno para cada instancia del mismo valor: no es así como funciona. En devolverá un simple booleano sí/no.
Probar:
UPDATE entry
SET total_comments = (SELECT COUNT(*)
FROM comments
WHERE entry.id = comments.eid
GROUP BY id)
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))