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

Consulta MYSQL INNER JOIN

Estas en el tema de Consulta MYSQL INNER JOIN en el foro de Mysql en Foros del Web. Cita: Iniciado por gnzsoloyo No. Exactamente al revés: MovimientoCaja(movimiento_id, fecha_hora) CajaCheque(movimiento_id, importe, banco_id, fecharecepcion, fechadeposito, fechaimputacion, ...) CajaEgreso(movimietno_id, importe, concepto_id, fechasalida, mediopago_id, ....) La relación ...

  #31 (permalink)  
Antiguo 27/01/2012, 14:03
 
Fecha de Ingreso: enero-2012
Mensajes: 158
Antigüedad: 13 años
Puntos: 1
Respuesta: Consulta MYSQL INNER JOIN

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No. Exactamente al revés:
MovimientoCaja(movimiento_id, fecha_hora)
CajaCheque(movimiento_id, importe, banco_id, fecharecepcion, fechadeposito, fechaimputacion, ...)
CajaEgreso(movimietno_id, importe, concepto_id, fechasalida, mediopago_id, ....)
La relación es:
CajaCheque->MovimientoCaja
CajaCheque->MovimientoCaja

¿Se entiende?

No puedo graficártelo porque estoy en horas de trabajo.

En CajaEgreso y CajaCheque, el campo movimietno_id es al mismo tiempo PK y FK.

Te insisto en que tienes que leer y estudiar el tema de las bases de datos relacionales. No es sencillo, pero es hipernecesario.

[URL="http://es.wikipedia.org/wiki/Bases_de_datos_relacionales"]Bases de Datos Relacionales en Wikipedia[/URL].




ALGO ASI ? http://www.online-imagenes.com/show-image.php?id=5b156026426267f42bca9628feecfe70

NO ENTIENDO MUY BIEN
  #32 (permalink)  
Antiguo 27/01/2012, 14:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 2 meses
Puntos: 2658
Respuesta: Consulta MYSQL INNER JOIN

Exactamente así.
El campo fecha de la tabla madre tiene por objeto establecer el momento de inserción del movimiento de modo de poder lista los movimientos realizados sin tener que acudir a las otras.
Por una cuestión de trazabilidad de los procesos es muy habitual agregar a las tablas que se escriben, columnas que indiquen cuándo se hizo la operación que se registra allí.
Podría agregarsele un ID de una tabla que podamos llamar "MovimientosConcpetos", donde listar cuales son las tablas que contiene movimientos de Caja y de ese modo poder dinamicamente crear las consultas para acotar el tipo de movimiento que se busca.
Eso es extender el sistema, en todo caso quedaría para ti ver lo que conviene, pero con ese esquema tal y como lo empiezas a visualizar, la consulta que te propuse, funcionaría perfectamente, y te devolvería el listado esperado:


Código MySQL:
Ver original
  1.     MC.movimiento_id,
  2.     MC.fecha,
  3.     IFNULL(CE.importe, 0.0) Egreso,
  4.     IFNULL(CC.importe, 0.0) Ingreso
  5.     movimiento_caja MC
  6.     LEFT JOIN CajaEgreso CE ON MC.movimiento_id = CE.movimiento_id
  7.     LEFT JOIN CajaCheque CC ON MC.movimiento_id = CC.movimiento_id
  8.     MC.movimiento_id
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #33 (permalink)  
Antiguo 27/01/2012, 14:27
 
Fecha de Ingreso: enero-2012
Mensajes: 158
Antigüedad: 13 años
Puntos: 1
Respuesta: Consulta MYSQL INNER JOIN

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Exactamente así.
El campo fecha de la tabla madre tiene por objeto establecer el momento de inserción del movimiento de modo de poder lista los movimientos realizados sin tener que acudir a las otras.
Por una cuestión de trazabilidad de los procesos es muy habitual agregar a las tablas que se escriben, columnas que indiquen cuándo se hizo la operación que se registra allí.
Podría agregarsele un ID de una tabla que podamos llamar "MovimientosConcpetos", donde listar cuales son las tablas que contiene movimientos de Caja y de ese modo poder dinamicamente crear las consultas para acotar el tipo de movimiento que se busca.
Eso es extender el sistema, en todo caso quedaría para ti ver lo que conviene, pero con ese esquema tal y como lo empiezas a visualizar, la consulta que te propuse, funcionaría perfectamente, y te devolvería el listado esperado:


Código MySQL:
Ver original
  1.     MC.movimiento_id,
  2.     MC.fecha,
  3.     IFNULL(CE.importe, 0.0) Egreso,
  4.     IFNULL(CC.importe, 0.0) Ingreso
  5.     movimiento_caja MC
  6.     LEFT JOIN CajaEgreso CE ON MC.movimiento_id = CE.movimiento_id
  7.     LEFT JOIN CajaCheque CC ON MC.movimiento_id = CC.movimiento_id
  8.     MC.movimiento_id
entonces eso significa


CHEQUE
FK ID_MOV
FECHA
IMPORTE

que al ID_MOV de la tabla cheque no le pongo auto_increment ni tamcpo primary key ?
  #34 (permalink)  
Antiguo 27/01/2012, 15:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 2 meses
Puntos: 2658
Respuesta: Consulta MYSQL INNER JOIN

Auto_increment ni a la tabla Cheque ni a la de Abono. Pero si indicas que ese campo es PK y también FK.
Por cierto, ponele el mismo nombre que tiene su tabla origen (movimiento). Cuando pones una FK en una tabla es buena práctica ponerle el mismo nombre que en la tabla origen.
También es buena práctica que los nombres de las PK no sean los mismos en todas las tablas, sino ponerles un nombre que haga referencia a la tabla (cheque_id, abono_id, movimiento_id, etc). De ese modo evitas solapamientos de nombres y simplificas la sintaxis de las consultas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #35 (permalink)  
Antiguo 30/01/2012, 08:29
 
Fecha de Ingreso: enero-2012
Mensajes: 158
Antigüedad: 13 años
Puntos: 1
Respuesta: Consulta MYSQL INNER JOIN

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Auto_increment ni a la tabla Cheque ni a la de Abono. Pero si indicas que ese campo es PK y también FK.
Por cierto, ponele el mismo nombre que tiene su tabla origen (movimiento). Cuando pones una FK en una tabla es buena práctica ponerle el mismo nombre que en la tabla origen.
También es buena práctica que los nombres de las PK no sean los mismos en todas las tablas, sino ponerles un nombre que haga referencia a la tabla (cheque_id, abono_id, movimiento_id, etc). De ese modo evitas solapamientos de nombres y simplificas la sintaxis de las consultas.
HOLA AMIGO LEI RECIENTU COMENTARIO:

ES ALGO ASI ?

create table cheque (
movimiento_id int,
fecha date,
importe decimal
) engine=innodb;


create table abono (
movimiento_id int,
fecha date,
importe decimal
) engine=innodb;

create table movimiento (
movimiento_id int not null auto_increment primary key,
fecha date
) engine=innodb;


si es asi como se insertarian los registros ?
  #36 (permalink)  
Antiguo 30/01/2012, 09:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 2 meses
Puntos: 2658
Respuesta: Consulta MYSQL INNER JOIN

Esa sería básicamente la idea.
Los INSERT, como consecuencia, se deben hacer siempre en el mismo orden:
1) Insertar el movimiento en la tabla movimiento.
2) Obtener el ID generado, sea usando la función de MySQL LAST_INSERT_ID(), o bien en PHP, la función mysql_insert_id(), que cumple la misma función (el MySQL Connector.Net tiene otra del mismo tipo para VB.Net y C.net).
3) Usar ese valor de ID recuperado para crear el segundo insert, sea en Abono o sea en Cheque, según corresponder.

Ocasionalmente se puede hacer todo el proceso en un stored procedure, lo que asegura la consistencia de los datos.

Consejo: Usar transacciones en cuanto aprendas a manejarlas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #37 (permalink)  
Antiguo 31/01/2012, 15:06
 
Fecha de Ingreso: enero-2012
Mensajes: 158
Antigüedad: 13 años
Puntos: 1
Respuesta: Consulta MYSQL INNER JOIN

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Esa sería básicamente la idea.
Los INSERT, como consecuencia, se deben hacer siempre en el mismo orden:
1) Insertar el movimiento en la tabla movimiento.
2) Obtener el ID generado, sea usando la función de MySQL LAST_INSERT_ID(), o bien en PHP, la función mysql_insert_id(), que cumple la misma función (el MySQL Connector.Net tiene otra del mismo tipo para VB.Net y C.net).
3) Usar ese valor de ID recuperado para crear el segundo insert, sea en Abono o sea en Cheque, según corresponder.

Ocasionalmente se puede hacer todo el proceso en un stored procedure, lo que asegura la consistencia de los datos.

Consejo: Usar transacciones en cuanto aprendas a manejarlas.
tengo ese codigo que es para grabar
y no se donde se pone el mysql_insert_id()


<?php
session_start();
?>
<?php
if($_POST["fechas"]!="" && $_POST["mes"]!="" && $_POST["cargos"]!="" && $_POST["ncheque"]!="" && $_POST["bancos"]!="" && $_POST["importe"]!="" && $_POST["moneda"]!="" && $_POST["girado"]!="" && $_POST["datos"]!="" && $_POST["detalles"]!="" && $_POST["nvoucher"]!="" && $_POST["usuario"]!=""){
require("funciones/acceso.php");
if($con=conectarmysql("sistecnomina")){
$consulta="INSERT INTO cheque VALUES('',UPPER('".
$_POST["fechas"]."'),'".$_POST["mes"]."','".$_POST["cargos"]."','".$_POST["ncheque"]."','".$_POST["bancos"]."','".$_POST["importe"]."','".$_POST["moneda"]."','".$_POST["girado"]."','".$_POST["datos"]."','".$_POST["detalles"]."','".$_POST["nvoucher"]."','".$_POST["usuario"]."')";
if(mysql_query($consulta,$con)){
header("Location:man_cheque.php");
}else
header("Location:nuevo_cheque.php?e=c");
}else
header("Location:nuevo_cheque.php?e=m");
}else
header("Location:nuevo_cheque.php?e=d");
?>
  #38 (permalink)  
Antiguo 31/01/2012, 17:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 2 meses
Puntos: 2658
Respuesta: Consulta MYSQL INNER JOIN

Eso ya es un tema ajeno a MySQL, y se trata en el Foro de PHP.
Por normas del Foro de Bases de Datos, no se deben tratar cosas de programación, ni postear código de programación en este foro (aún cuando algún despistado lo haga).

De todos modos, para no meter la pata, siempre te conviene empezar leyendo las FAQs de PHP, especialmente el tema de Integración con la Base de Datos.
Lo que si puedo decirte es que estás haciendo un código innecesariamente complicado. Trata de empezar por cosas más simples, para complicar tendrás tiempo.
Y cuando quieras ver cómo se usa una función de MySQL, mira el Manual de Referencia On-Line. Tiene muchos ejemplos y posts de los usuarios que son muy buenos.
Si no me crees, mira este, en el Foro de PHP, referido precisamente al mysql_insert_id().
Usa el buscador. Hay decenas de ejemplos en ese foro.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: join, tabla
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 12:53.