MySQL - resta de valores de tablas distintas

 
Vista:
sin imagen de perfil
Val: 28
Ha aumentado su posición en 2 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

resta de valores de tablas distintas

Publicado por David (16 intervenciones) el 24/01/2018 15:01:44
hola, mi pregunta es algo basica supongo pero sinceramente no se como hacerla y en internet he encontrado pocos ejemplos;
teng dos tablas (tabla 1, "asientos disponibles") ,(tabla 2,"asientos ocupados") necesito hacer una resta entre asientos ocupados con los disponibles, pero que sea en forma de update, por que he visto varios ejemplos que hacen eso con SELECT y JOIN, pero lo que yo necesito es que el resultado que me de cambie completamente la tabla 1.
1
2
3
4
5
6
7
UPDATE tabla1 SET entradas = T2.Stock
    FROM tabla1 T1
    INNER JOIN (
        SELECT T2.id, T2.entradas - T4.salidas Stock
        FROM tabla1 T3
        INNER JOIN tabla2 T4 ON T3.id = T4.id
    ) T2 ON T1.id = T2.id
consegui este codigo por internet pero no lo entiendo, si alguien puede darme una pequeña explicacion de como podria hacerlo se lo agradeceria.
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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

resta de valores de tablas distintas

Publicado por Leonardo Josué (414 intervenciones) el 24/01/2018 18:34:28
Hola David:

La consulta que pones, si bien puede funcionar, está complicando de más las cosas, cuando no hay necesidad de complicar tanto...

cuando tienes que hacer una actualización que involucre varias tablas, lo "recomendable" es que comiences por hacer una consulta SELECT que te sirva para obtener todos los datos que necesitas para la actualización y después adecuarla a una sentencia UPDATE, veamos si con un ejemplo queda un poco más claro.

supongamos que tienes estas dos tablas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT * FROM tabla1;
+-----------+----------------------+
| sala      | asientos_disponibles |
+-----------+----------------------+
| sala uno  |                   50 |
| sala dos  |                   70 |
| sala tres |                  100 |
+-----------+----------------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla2;
+-----------+-------------------+
| sala      | asientos_ocupados |
+-----------+-------------------+
| sala uno  |                45 |
| sala dos  |                70 |
| sala tres |                72 |
+-----------+-------------------+
3 rows in set (0.00 sec)

Entonces, si quisieras actualizar la tabla1 para RESTAR los asientos que están en la tabla2, lo primero que tienes que hacer es RELACIONAR ESTAS DOS TABLAS para saber el numero de asientos disponibles y ocupados para cada sala.

Esto lo haces con un JOIN. En este el ejemplo utiliza un INNER JOIN, pero podrías utilizar un LEFT JOIN o un RIGTH JOIN de acuerdo a tu información. entonces, tendrías algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT
    ->   tabla1.sala,
    ->   tabla1.asientos_disponibles,
    ->   tabla2.asientos_ocupados,
    ->   tabla1.asientos_disponibles - tabla2.asientos_ocupados nuevo_stock
    -> FROM tabla1
    -> INNER JOIN tabla2 ON tabla1.sala = tabla2.sala;
+-----------+----------------------+-------------------+-------------+
| sala      | asientos_disponibles | asientos_ocupados | nuevo_stock |
+-----------+----------------------+-------------------+-------------+
| sala uno  |                   50 |                45 |           5 |
| sala dos  |                   70 |                70 |           0 |
| sala tres |                  100 |                72 |          28 |
+-----------+----------------------+-------------------+-------------+
3 rows in set (0.00 sec)

Observa que al tener en la misma consulta los asientos disponibles y los asientos ocupados, puedes hacer la resta y obtener el valor FINAL que quieres imputarle a tu tabla 1. si observas esta consulta es muy parecida a lo que tienes en la subconsulta de tu UPDATE a la que le ponen el alias T2, pero aquí es donde tu consulta se complica de más: En realidad no hay necesidad de meter esto en una subconsulta, como lo estás haciendo en tu ejemplo... puedes hacerlo de manera directa.

Como te comenté, ahora la idea sería convertir el SELECT en una sentencia UPDATE:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> UPDATE tabla1
    -> INNER JOIN tabla2 ON tabla1.sala = tabla2.sala
    -> SET tabla1.asientos_disponibles = tabla1.asientos_disponibles - tabla2.asientos_ocupados;
Query OK, 3 rows affected (0.14 sec)
Rows matched: 3  Changed: 3  Warnings: 0
 
mysql> SELECT * FROM tabla1;
+-----------+----------------------+
| sala      | asientos_disponibles |
+-----------+----------------------+
| sala uno  |                    5 |
| sala dos  |                    0 |
| sala tres |                   28 |
+-----------+----------------------+
3 rows in set (0.00 sec)

La parte de código entre el UPDATE y el SET, es exactamente la misma que entre el FROM y el WHERE de un SELECT (en este caso no hay WHERE) y en el SET, haces la asignación de los campos que quieres actualizar.

Dale un vistazo para ver si esto que queda un poco más claro.

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
sin imagen de perfil
Val: 28
Ha aumentado su posición en 2 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

resta de valores de tablas distintas

Publicado por David (16 intervenciones) el 24/01/2018 19:50:01
Muchas gracias, de verdad me quedo claro, y para ser sincero no tenia ni idea que esto:
La parte de código entre el UPDATE y el SET, es exactamente la misma que entre el FROM y el WHERE de un SELECT (en este caso no hay WHERE) y en el SET, haces la asignación de los campos que quieres actualizar.
funcionara asi.
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
sin imagen de perfil
Val: 2
Ha disminuido su posición en 34 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

resta de valores de tablas distintas

Publicado por Brayan Alexis (1 intervención) el 08/10/2019 21:18:27
Hola buenas para mi caso no funciono al momento de generar el update o no se estoy algo confundido a ver si tu me puedes ayudar y entender que es lo que pasa, yo tengo un inventario donde tengo una cantidad de productos, al generar cualquier venta debo restar esa venta en la cantidad del inventario. al generar el update no entiendo que pasa porque al observar la tabla de compras donde esta el inventario se debe restar la cantidad de la venta generada podrias ayudarme a mi me genera la resta pero no se mueve la tabla de inventario y la de ventas si


1
2
UPDATE compras INNER JOIN ventas ON compras.ncompra = ventas.nventa
SET compras.cantidadcompra = compras.cantidadcompra - ventas.cantidad


ayuda-uno
221
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

resta de valores de tablas distintas

Publicado por AlexMC (1 intervención) el 15/07/2020 19:09:22
Muchas gracias hermano por tu aporte, es de gran ayuda.
Saludos!
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

resta de valores de tablas distintas

Publicado por Ramlam (2 intervenciones) el 31/07/2020 14:14:46
Buenas leyendo, creo tener el mimo problema... tengo la tabla factura y producto.. quiero vender un producto y que se me realice el descuento de la tabla producto al facturar. La primera vez lo hace bien pero ya luego si vendo otro producto. Me hace el descuento nuevo y me toma el descuento anterior

1
2
3
4
5
6
7
$sql=mysqli_query($con, "UPDATE products
INNER JOIN detalle_factura
ON products.id_producto = detalle_factura.id_producto
SET products.cantidad_pro = products.cantidad_pro - detalle_factura.cantidad");
 
$query_update=mysqli_query($con, $sql);
clearstatcache();
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