MySQL - Update con 2 tablas relacionadas

   
Vista:

Update con 2 tablas relacionadas

Publicado por Silvestre (4 intervenciones) el 01/03/2018 13:42:55
Hola amigos,

Me gustaría pediros ayuda para la construcción de una consulta de actualización que no logro adecuar correctamente. Tengo 2 tablas, una de clientes general y otra una lista única de correos electrónicos que han sido verificados, y que deben actualizarse a la tabla general de clientes.

En concreto la tabla EmailVerificados contiene 2 campos (un indice único con el email y otra con el resultado de su verificación); el cual deseamos copiar a la tabla de clientes; He probado con lo siguiente pero da cero movimientos.

UPDATE clientes, EmailVerificados set Clientes.VEmailResult = EmailVerificados.result where Clientes.Email = EmailVerificados.email

Saludos,
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Update con 2 tablas relacionadas

Publicado por Leonardo Josué (383 intervenciones) el 01/03/2018 16:09:04
Hola Silvestre:

La consulta no parece tener nada de malo, así es que si te está dando cero movimientos es debido a que simplemente no hay ningún registro que cumpla con la condición que estás poniendo en el WHERE... aquí hay un ejemplo de lo que creo que estás tratando de hacer:

Supongamos que tienes estas tablas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT * FROM clientes;
+------------+----------------+--------------+---------------------------+
| id_cliente | nombre         | vemailresult | email                     |
+------------+----------------+--------------+---------------------------+
|          1 | cliente uno    | NULL         | cliente_uno@correo.com    |
|          2 | cliente dos    | NULL         | cliente_dos@correo.com    |
|          3 | cliente tres   | NULL         | cliente_tres@correo.com   |
|          4 | cliente cuatro | NULL         | cliente_cuatro@correo.com |
+------------+----------------+--------------+---------------------------+
4 rows in set (0.00 sec)
 
mysql> SELECT * FROM emailVerificados;
+-------------------------+---------------+
| email                   | result        |
+-------------------------+---------------+
| cliente_uno@correo.com  | verificado    |
| cliente_tres@correo.com | no verificado |
+-------------------------+---------------+
2 rows in set (0.00 sec)

Entonces, si entendí bien lo que quieres es actualizar el campo "vemailresult" a partir del campo "result" de los correos verificados, entonces, poniendo tu UPDATE sin cambiar nada, tienes esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> UPDATE clientes, EmailVerificados
    -> SET Clientes.VEmailResult = EmailVerificados.result
    -> WHERE Clientes.Email = EmailVerificados.email;
Query OK, 2 rows affected (0.19 sec)
Rows matched: 2  Changed: 2  Warnings: 0
 
mysql> SELECT * FROM clientes;
+------------+----------------+---------------+---------------------------+
| id_cliente | nombre         | vemailresult  | email                     |
+------------+----------------+---------------+---------------------------+
|          1 | cliente uno    | verificado    | cliente_uno@correo.com    |
|          2 | cliente dos    | NULL          | cliente_dos@correo.com    |
|          3 | cliente tres   | no verificado | cliente_tres@correo.com   |
|          4 | cliente cuatro | NULL          | cliente_cuatro@correo.com |
+------------+----------------+---------------+---------------------------+
4 rows in set (0.00 sec)

Por lo tanto funciona... la manera más simple de ver los registros que se van a afectar es hacer un SELECT en lugar de un UPDATE, así:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM
    -> Clientes, EmailVerificados
    -> WHERE Clientes.Email = EmailVerificados.email;
+------------+--------------+--------------+-------------------------+-------------------------+---------------+
| id_cliente | nombre       | vemailresult | email                   | email                   | result        |
+------------+--------------+--------------+-------------------------+-------------------------+---------------+
|          1 | cliente uno  | NULL         | cliente_uno@correo.com  | cliente_uno@correo.com  | verificado    |
|          3 | cliente tres | NULL         | cliente_tres@correo.com | cliente_tres@correo.com | no verificado |
+------------+--------------+--------------+-------------------------+-------------------------+---------------+
2 rows in set (0.02 sec)

Insisto, si esta consulta no te arroja registros es simplemente culpa de que no hay información que cumpla con tu condición.

postea tus datos de ejemplo y coméntanos.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Update con 2 tablas relacionadas

Publicado por Silvestre (4 intervenciones) el 01/03/2018 16:26:51
Buenas tardes Leo,

Muchísimas gracias por tu extensa y al mismo muy gráfica respuesta sobre esta cuestión.

En la tabla de clientes el campo email que sirve de relación con la tabla de EmailVerificados puede estar repetido, es decir, se da el hecho de que varios registros de la tabla de clientes pueden tener un mismo email, no ocurre así en la tabla de correos verificados donde el índice único es precisamente el campo email. No sé si esto arroja algo de luz ...

Las coincidencias deberían darse ya que todos los correos de la tabla de emailverificados existen en la tabla de clientes

He comprobado como has comentado y funciona correctamente, arrojando miles de coincidencias :
SELECT * FROM

Clientes, EmailVerificados

WHERE Clientes.Email = EmailVerificados.email;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Update con 2 tablas relacionadas

Publicado por Leonardo Josué (383 intervenciones) el 01/03/2018 16:51:20
Podrías postear cuál es el resultado de esta consulta:

1
2
3
SELECT Clientes.VEmailResult, EmailVerificados.result
FROMClientes, EmailVerificados
WHERE Clientes.Email = EmailVerificados.email;

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Update con 2 tablas relacionadas

Publicado por Silvestre (4 intervenciones) el 01/03/2018 17:01:17
Mostrando filas 0 - 499 (total de 13782, La consulta tardó 0,0000 segundos.)

SELECT Clientes.VEmailResult, EmailVerificados.result FROM Clientes, EmailVerificados WHERE Clientes.Email = EmailVerificados.email

Result
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Update con 2 tablas relacionadas

Publicado por Leonardo Josué (383 intervenciones) el 01/03/2018 17:16:49
Si observas, ambas columnas TIENEN EL MISMO RESULTADO, esto quiere decir que aunque actualices el valor de la columna NO SE EFECTÚAN CAMBIOS EN LA BASE DE DATOS.

Observa estas dos sentencias UPDATES:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mysql> SELECT Clientes.VEmailResult, EmailVerificados.result
    -> FROM Clientes, EmailVerificados
    -> WHERE Clientes.Email = EmailVerificados.email;
+--------------+---------------+
| VEmailResult | result        |
+--------------+---------------+
| NULL         | verificado    |
| NULL         | no verificado |
+--------------+---------------+
2 rows in set (0.00 sec)
 
mysql> UPDATE clientes, EmailVerificados
    -> SET Clientes.VEmailResult = EmailVerificados.result
    -> WHERE Clientes.Email = EmailVerificados.email;
Query OK, 2 rows affected (0.18 sec)
Rows matched: 2  Changed: 2  Warnings: 0
 
mysql> SELECT * FROM clientes;
+------------+----------------+---------------+---------------------------+
| id_cliente | nombre         | vemailresult  | email                     |
+------------+----------------+---------------+---------------------------+
|          1 | cliente uno    | verificado    | cliente_uno@correo.com    |
|          2 | cliente dos    | NULL          | cliente_dos@correo.com    |
|          3 | cliente tres   | no verificado | cliente_tres@correo.com   |
|          4 | cliente cuatro | NULL          | cliente_cuatro@correo.com |
+------------+----------------+---------------+---------------------------+
4 rows in set (0.00 sec)

En el primer se observa que hay dos registros que cumplen con la condición y que las columnas tienen valores distintos, por lo tanto, al ejecutar el UPDATE, en la última línea aparece que hay 2 registros que cumplen con la condición (matched) y que estos dos registros fueron cambiados (changed).

ahora bien si vuelvo a ejecutar exactamente lo mismo observa que pasa;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT Clientes.VEmailResult, EmailVerificados.result
    -> FROM Clientes, EmailVerificados
    -> WHERE Clientes.Email = EmailVerificados.email;
+---------------+---------------+
| VEmailResult  | result        |
+---------------+---------------+
| verificado    | verificado    |
| no verificado | no verificado |
+---------------+---------------+
2 rows in set (0.00 sec)
 
mysql> UPDATE clientes, EmailVerificados
    -> SET Clientes.VEmailResult = EmailVerificados.result
    -> WHERE Clientes.Email = EmailVerificados.email;
Query OK, 0 rows affected (0.10 sec)
Rows matched: 2  Changed: 0  Warnings: 0

El SELECT te muestra que hay dos registros que cumplen con la información, pero tal como lo pones en la imagen, observa que las columnas YA TIENEN EL MISMO VALOR. Por lo tanto, cuando ejecutas el UPDATE hay dos registros que cumplen con la condición, pero NINGUNO DE ELLOS CAMBIA DE VALOR, por lo tanto NO SE AFECTÓ NINGÚN REGISTRO.

¿Se entiende?

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
3
Comentar

Update con 2 tablas relacionadas

Publicado por Silvestre (4 intervenciones) el 01/03/2018 17:32:45
Buenas tardes Leo,

Te agradezco mucho todas las molestias didácticas que te has tomado para dar luz y solución a este asunto.

Pero sobre todo discúlpame porque había cometido un error garrafal al no revisar correctamente una de las actualizaciones, que ya habían hecho el trabajo correctamente (como tu señalabas en la primera respuesta). Otra vez más se demuestra que la mayoría de errores en la programación corresponden a “despistes humanos”

¡Funciona todo correctamente!.

Silvestre.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Update con 2 tablas relacionadas

Publicado por Leonardo Josué (383 intervenciones) el 01/03/2018 17:42:27
Literalmente, no hay nada que agradecer, ya que todo estaba correcto desde inicio n_n

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad