Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Update cruzado

Estas en el tema de Update cruzado en el foro de Mysql en Foros del Web. Hola, empiezo con codigo. Código PHP: mysql_query ( "UPDATE t1,t2 SET       t1.v1=t1.v1-1       WHERE       t2.v2 != ''      " );  Me gustaria restar un valor en la tabla 1 por cada ...
  #1 (permalink)  
Antiguo 04/12/2011, 01:03
Avatar de chechu_  
Fecha de Ingreso: mayo-2007
Mensajes: 282
Antigüedad: 16 años, 11 meses
Puntos: 0
Update cruzado

Hola, empiezo con codigo.
Código PHP:
mysql_query("UPDATE t1,t2 SET 
     t1.v1=t1.v1-1 
     WHERE 
     t2.v2 != ''
     "
); 
Me gustaria restar un valor en la tabla 1 por cada fila que tenga la tabla 2 ¿esto es posible con query?
  #2 (permalink)  
Antiguo 04/12/2011, 04:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Update cruzado

¿Y cuál sería la relación que hay entre Tabla1 y Tabla2?
En esa sentencia no las estás relacionando, y si no tienen nada en común, no te actualizará nada porque su JOIN implícito devolvería cero registros.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 04/12/2011, 07:23
Avatar de chechu_  
Fecha de Ingreso: mayo-2007
Mensajes: 282
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Update cruzado

Claro... ¿Como podria hacer esto entonces? porque no hay ninguna relación...


Código PHP:
mysql_query("UPDATE t1,t2 SET 
     t1.v1=t1.v1-1 
     WHERE 
     t2.v2 = 2
     "
); 
  #4 (permalink)  
Antiguo 04/12/2011, 08:03
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Update cruzado

Si las tablas no están relacionadas, ¿por qué dices hacer un decremento de un valor de la primera tabla por cada registro de la segunda?
Una de dos, o hay una relación y no la estás diciendo, o no hay una relación y entonces la operación no tiene sentido.

Voy a hacer una aclaración:
Si haces la operación tal y como la planteas, puede suceder que:
- Haya uno o más campos que tengan el mismo nombre en ambas tablas (caso en el cual MySQL interpretará que están relacionadas por esos campos), hará un matching entre esos campos y realizará el decremento en los registros que devuelva. Si no hay valores coincidentes entre ambas tablas en esos campos, devolverá un conjunto nulo de registros.
- Si no hay uno o mas campos con el mismo nombre, puede realizar un producto cartesiano, lo que significa que devolvería la combinación de todos los registros de la primera tabla con cada registro de la segunda. Esto implicaría que si ambas tablas tuviesen 100 registros, devolverá una tabla de 10.000 resultados combinados, e implica que el decremento se aplicará en este ejemplo, 100 veces en cada registro de la primera tabla.

Tengo la impresión de que estás planteando un ejemplo genérico, y en esto s casos no hay nada genérico. Es un caso concreto lo que debemos analizar.

Postea el caso real.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 04/12/2011, 09:04
Avatar de chechu_  
Fecha de Ingreso: mayo-2007
Mensajes: 282
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Update cruzado

ok, a ver si vale con esto.

La relación seria esta.

La tabla 1 indica la cantidad de registros que tiene la tabla 2 con un valor en concreto.

Es decir, la tabla 1 contiene el conteo de las filas de la tabla dos que tienen un valor de 2 en la columna 1.

Al mismo tiempo, la tabla uno contiene el en su segunda columna el conteo de de las filas de la tabla 2 que tienen en su segunda columna un valor de 2.
  #6 (permalink)  
Antiguo 04/12/2011, 09:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Update cruzado

Bueno, en ese contexto tengo yo a primera vista dos respuestas para ti:
1) Lo tendrás que resolver programáticamente, estimo que en PHP, ya que es donde principalmente estás participando y asumo que en eso lo estás haciendo. No podrás resolverlo en una sola consulta porque los valores de ambas talas están relacionados pragmáticamente, y no por la estructura de la base.
2) Personalmente no le veo la utilidad a almacenar en una tabla información que puedes obtener de la tabla origen por medio de una consulta simple y mejor elaborada. Supongo que tendrás laguna razón para hacerlo así, pero a mi me parece que hay defectos conceptuales de diseño en esa base.

Como sea, no puedes hacerlo en una consulta en tanto un JOIN no sea capaz de devolver la lista de registros a modificar. Hasta que no tengas eso, deberás hacerlo iterativamente por programación, un UPDATE a la vez sobre una sola tabla, y actualizando la segunda.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 04/12/2011, 12:06
Avatar de chechu_  
Fecha de Ingreso: mayo-2007
Mensajes: 282
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Update cruzado

Ahá, comprendo.
¿Cual seria esa consulta simple y mejor elaborada?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Como sea, no puedes hacerlo en una consulta en tanto un JOIN no sea capaz de devolver la lista de registros a modificar. Hasta que no tengas eso, deberás hacerlo iterativamente por programación, un UPDATE a la vez sobre una sola tabla, y actualizando la segunda.
No he entendido bien esto último.

¿como se haria este update sobre una tabla y actualizando la segunda? no podria hacerlo de un golpe por asi decir como con un solo query...

Y si, estoy usando php.
  #8 (permalink)  
Antiguo 04/12/2011, 12:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Update cruzado

Cita:
¿como se haria este update sobre una tabla y actualizando la segunda? no podria hacerlo de un golpe por asi decir como con un solo query...
Me refiero a que si en el primer UPDATE estás modificando uno de los campos cuyo valor estás contando y almacenando en la otra tabla, obviamente ese conteo queda desactualizado. Entonces, una vez que hayas terminado de modificar los valores de la columna afectada, es evidente que tienes que actualizar la segunda tabla... ¿No te parece?
En cualquier caso, todo sería mejor si el sistema estuviese mejor diseñado... A eso me refiero con esto:
Cita:
Personalmente no le veo la utilidad a almacenar en una tabla información que puedes obtener de la tabla origen por medio de una consulta simple y mejor elaborada. Supongo que tendrás laguna razón para hacerlo así, pero a mi me parece que hay defectos conceptuales de diseño en esa base.
Porque para saber cuántos registros tiene cada valor posible dentro de una columna, solo necesito hacer un SELECT usando un COUNT() donde verifique una condición, y usando GROP BY sobre esa columna.
En realidad, hacer eso es bastante simple.

Para comenzar a ayudarte en eso primero deberías describirnos lo que se supone que debe hacer ese sistema y postear la estructura real de las tablas.

¿Estás dispuesto a postear esa información?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 04/12/2011, 12:56
Avatar de chechu_  
Fecha de Ingreso: mayo-2007
Mensajes: 282
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Update cruzado

Ya me estás ayudando mucho y sinceraente, es de agradecer.

No tendria ningun problema en postear ninguna operación, pero mi idea, como imaginarás es aprender lo que desconozco y por este motivo he mostrado ejemplos más genericos.

No he usado COUNT y me he complicado más de lo necesario porque por lo que almenos tengo entendido, erroneamente o no, es que puede dar algun tipo de problema el tener muchos valores en la tabla y realizar una consulta, aunque no se cuales son exactamente estos limites.
  #10 (permalink)  
Antiguo 04/12/2011, 13:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Update cruzado

Sin ver la estructura de las tablas, las consultas que realizas y saber qué es lo que necesitas conseguir, no hay mucho por donde empezar...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 04/12/2011, 15:26
Avatar de chechu_  
Fecha de Ingreso: mayo-2007
Mensajes: 282
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Update cruzado

¿Como podria explicarte todo eso?
  #12 (permalink)  
Antiguo 04/12/2011, 17:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Update cruzado

¿Ah?
...


Pues por lo pronto:
- Copia y postea el CREATE TABLE de las tablas involucradas en la operación.
- Describe en qué consiste el proceso que deseas hacer, y de qué datos se trata.
- Postea un ejemplo de la captura de un INSERT/UPDATE/DELETE que afecte el tipo de datos usado.

O por lo menos, postea el DER físico (diagrama de tablas) para poder entender la lógica de esto.

Para darte un acercamiento de qué cosas no se comprenden bien en tu ejemplo empecemos:
- Dices que usas una tabla para mantener la cuenta de valores iguales (de un rango determinado) en una columna de otra tabla, pero no dices qué es lo que cuentas. Es decir, qué representa esa tabla de datos.
- Tampoco queda claro, por qué lo necesitas mantener en una tabla separada. Se infiere que algún proceso haces para obtener el dato, pero no queda para nada claro qué razonamiento te llevó a ese esquema.
- Como no sabemos en qué consiste el sistema, no podemos decirte si el método usado por ti es correcto o no. Pero se infiere que hay una utilización ineficiente de las capacidades de MySQL, ya que nadie usa una tabla para mantener información de esa forma; tablas con datos calculables no resultan eficientes.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 04/12/2011 a las 17:17

Etiquetas: cruzado, query, sql, tabla, update
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:33.