2010-06-07 14 views
7

Hola tengo tablas como esta:ACTUALIZACIÓN MySQL con IN y Subconsulta

entrada de la tabla:

Identificación | total_comments
_____________________
1 | 0
2 | 0
3 | 0
4 | 0

mesa de comentarios:

Identificación | eid | comentario
_____________________
1 | 1 | comentario sdfd
2 | 1 | prueba de prueba
3 | 1 | comentar texto
4 | 2 | dummy comment
5 | 2 | muestra de comentario
6 | 1 | fg dfh fgh

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

resultados que consigo es: entrada

tabla:

Identificación | total_comments
_____________________
1 | 1
2 | 1
3 | 0
4 | 0

resultados esperados:

entrada de la tabla:

Identificación | total_comments
_____________________
1 | 4
2 | 2
3 | 0
4 | 0

Cualquier ayuda será apreciada.

Respuesta

14

Uso:

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

sí, estoy buscando algo así ... mi motivo es ejecutar una consulta de actualización basada en la subconsulta .... es actualizar "totales_comentarios" en la tabla de "entrada" con acutal número de observaciones, para Identificación de "entrada" si funciono consulta que he especificado que sólo se suma 1 para todo número de comentarios que se encuentra en subqery Aquí lo consulta SQL se convierte en después de carreras de subconsulta:. actualizar la entrada total_comments SET = total_comments + 1 WHERE id IN (1,1,1,2,2,1) , por lo que la actualización solo se ejecuta una vez para 1 y 2 id en la tabla de entrada. Porque es como funciona IN. Pero yo quiero un poco cómo ha de hacerlo 4 veces durante 1 y 2 veces por – Johal

+0

2. La única forma en que pienso es que al ejecutar algo como subconsulta que lo que no sé cómo hacerlo: actualizar la entrada SET total_comments = + total_comments @count WHERE id IN (SELECT eid, count (*) as @count FROM comments WHERE id IN (1,2,3,4,5,6)) pero luego no funciona porque hay varias filas y también no sé cómo referir a @count en condición establecida :( – Johal

1

Eso es exactamente lo que esperaría. El ID está EN el conjunto que le da, por lo que total_comments = total_comments + 1.

No va a agregar uno para cada instancia del mismo valor: no es así como IN funciona. IN devolverá un booleano simple sí/no.

+0

sé ... pero quiero algún método para que pueda contar el número de entry.id en subqery. Lo puedo hacer ejecutando subquery sperate y luego ejecutando la consulta de actualización usando for loop para todos esos. Pero quiero hacerlo en una consulta, ese es mi problema :( – Johal

1

Probar:

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

esto se ejecutará para todos los registros en la tabla de entrada, pero quiero ejecutar solo para registros especificados, es por eso que utilicé la cláusula IN ... – Johal

3

Si realmente necesita total_comments en una tabla separada, que haría que una visión.

CREATE VIEW entry AS 
    SELECT id, COUNT(comments) AS total_comment 
    FROM comments 
    GROUP BY id 

De esta manera se evita la tarea de mantenimiento de actualizar la tabla total_comments por completo.

+0

+1: estoy completamente de acuerdo, esto es una mejor opción de diseño que la estructura de tabla actual. –

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