Código PHP:
mysql_query("UPDATE t1,t2 SET
t1.v1=t1.v1-1
WHERE
t2.v2 != ''
");
| ||||
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) |
| ||||
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) |
| ||||
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. |
| ||||
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) |
| ||||
Respuesta: Update cruzado Ahá, comprendo. ¿Cual seria esa consulta simple y mejor elaborada? Cita: 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. |
| ||||
Respuesta: Update cruzado Cita: 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?¿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... En cualquier caso, todo sería mejor si el sistema estuviese mejor diseñado... A eso me refiero con esto: Cita: 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.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. 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) |
| ||||
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. |
| ||||
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) |
| ||||
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: |