Ver Mensaje Individual
  #9 (permalink)  
Antiguo 20/06/2015, 04:58
Avatar de gnzsoloyo
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, 5 meses
Puntos: 2658
Respuesta: Comprobar registros de varias tablas

Lo pruebas copiando al sentencia y ejecutando en MySQL sin usar PHP, por ejemplo usando el phpMyadmin.wque para eso existe.
Las sentencias de SQL nunca se prueban en un lenguaje de programación en la etapa de desarrollo. Se hacen directamente en la base de datos y luego se las traslada al programa.
Hazlo.

Por otro lado, Para entender la lógica de la consulta sólo debes leer un manual básico de SQL, porque no estoy inventando nada.

Vamos a ver si se entiende la idea.
Primero creamos y cargamos las tablas que imagino tienes:

Código MySQL:
Ver original
  1. mysql> DROP TABLE IF EXISTS PREPAGO;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> DROP TABLE IF EXISTS ALTAS;
  5. Query OK, 0 rows affected (0.05 sec)
  6.  
  7. mysql> DROP TABLE IF EXISTS FRAUDE;
  8. Query OK, 0 rows affected (0.00 sec)
  9.  
  10. mysql> DROP TABLE IF EXISTS PORTABILIDAD;
  11. Query OK, 0 rows affected (0.00 sec)
  12.  
  13. mysql> CREATE TABLE PREPAGO (
  14.     ->     NUMERO INT UNSIGNED PRIMARY KEY,
  15.     ->     FECHA_ALTA DATE NOT NULL
  16.     -> );
  17. Query OK, 0 rows affected (0.04 sec)
  18.  
  19. mysql> CREATE TABLE ALTAS (
  20.     ->     NUMERO INT UNSIGNED PRIMARY KEY,
  21.     ->     FECHA_ALTA DATE NOT NULL
  22.     -> );
  23. Query OK, 0 rows affected (0.05 sec)
  24.  
  25. mysql> CREATE TABLE FRAUDE (
  26.     ->     NUMERO INT UNSIGNED PRIMARY KEY,
  27.     ->     FECHA_ALTA DATE NOT NULL
  28.     -> );
  29. Query OK, 0 rows affected (0.01 sec)
  30.  
  31. mysql> CREATE TABLE PORTABILIDAD (
  32.     ->     NUMERO INT UNSIGNED PRIMARY KEY,
  33.     ->     FECHA_ALTA DATE NOT NULL
  34.     -> );
  35. Query OK, 0 rows affected (0.05 sec)
  36. mysql> INSERT INTO PREPAGO VALUES (123456, '2015-03-25');
  37. Query OK, 1 row affected (0.00 sec)
  38.  
  39. mysql> INSERT INTO ALTAS VALUES (123456, '2015-04-11');
  40. Query OK, 1 row affected (0.00 sec)
  41.  
  42. mysql> INSERT INTO FRAUDE VALUES (123456, '2015-04-30');
  43. Query OK, 1 row affected (0.00 sec)
  44.  
  45. mysql> INSERT INTO PORTABILIDAD VALUES (123456, '2015-06-03');
  46. Query OK, 1 row affected (0.00 sec)
Luego realizamos una consulta solo para verificar lo que coincide entre cada par de tablas:
Código MySQL:
Ver original
  1. mysql> SELECT A.numero, 'Altas' Estado, A.fecha_alta
  2.     -> FROM prepago P INNER JOIN altas A ON P.numero = A.numero
  3.     -> WHERE A.numero = 123456
  4.     -> UNION
  5.     -> SELECT F.numero, 'Fraude' Estado, F.fecha_alta
  6.     -> FROM prepago P INNER JOIN fraude F ON P.numero = F.numero
  7.     -> WHERE F.numero = 123456
  8.     -> UNION
  9.     -> SELECT PO.numero, 'Portabilidad' Estado, PO.fecha_alta
  10.     -> FROM prepago P INNER JOIN portabilidad PO ON P.numero = PO.numero
  11.     -> WHERE PO.numero = 123456;
  12.  
  13. +--------+--------------+------------+
  14. | numero | Estado       | fecha_alta |
  15. +--------+--------------+------------+
  16. | 123456 | Altas        | 2015-04-11 |
  17. | 123456 | Fraude       | 2015-04-30 |
  18. | 123456 | Portabilidad | 2015-06-03 |
  19. +--------+--------------+------------+
  20. 3 rows in set (0.00 sec)
Luego, quiero averiguar solo cual es el ultimo estado:
Código MySQL:
Ver original
  1. mysql> SELECT numero, estado, fecha_alta fecha
  2.     -> FROM (
  3.     ->  SELECT  A.numero, 'Altas' Estado, A.fecha_alta
  4.     ->  FROM prepago P INNER JOIN altas A ON P.numero = A.numero
  5.     ->  WHERE A.numero = 123456
  6.     ->  UNION
  7.     ->  SELECT F.numero, 'Fraude' Estado, F.fecha_alta
  8.     ->  FROM prepago P INNER JOIN fraude F ON P.numero = F.numero
  9.     ->  WHERE F.numero = 123456
  10.     ->  UNION
  11.     ->  SELECT PO.numero, 'Portabilidad' Estado, PO.fecha_alta
  12.     ->  FROM prepago P INNER JOIN portabilidad PO ON P.numero = PO.numero
  13.     ->  WHERE PO.numero = 123456) T1
  14.     -> ORDER BY fecha_alta DESC
  15.     -> LIMIT 1;
  16. +--------+--------------+------------+
  17. | numero | estado       | fecha      |
  18. +--------+--------------+------------+
  19. | 123456 | Portabilidad | 2015-06-03 |
  20. +--------+--------------+------------+
  21. 1 row in set (0.00 sec)

Todo esto es SQL bastante básico. Es de manual.


Ahora bien, supongamos que en lugar de tener los datos en las cuatro tablas, solo está la maestra (PREPAGO), y la de fraude.
Código MySQL:
Ver original
  1. DROP TABLE IF EXISTS PREPAGO;
  2. DROP TABLE IF EXISTS PORTABILIDAD;
  3.  
  4. CREATE TABLE PREPAGO (
  5.     NUMERO INT UNSIGNED PRIMARY KEY,
  6.     FECHA_ALTA DATE NOT NULL
  7. );
  8.  
  9. CREATE TABLE ALTAS (
  10.     NUMERO INT UNSIGNED PRIMARY KEY,
  11.     FECHA_ALTA DATE NOT NULL
  12. );
  13.  
  14. CREATE TABLE FRAUDE (
  15.     NUMERO INT UNSIGNED PRIMARY KEY,
  16.     FECHA_ALTA DATE NOT NULL
  17. );
  18.  
  19. CREATE TABLE PORTABILIDAD (
  20.     NUMERO INT UNSIGNED PRIMARY KEY,
  21.     FECHA_ALTA DATE NOT NULL
  22. );
  23. INSERT INTO PREPAGO VALUES (123456, '2015-03-25');
  24. INSERT INTO FRAUDE VALUES (123456, '2015-04-30');
Entonces la consulta simple ya devuelve lo necesario:

Código MySQL:
Ver original
  1. mysql> SELECT  A.numero, 'Altas' Estado, A.fecha_alta
  2.     -> FROM prepago P INNER JOIN altas A ON P.numero = A.numero
  3.     -> WHERE A.numero = 123456
  4.     -> UNION
  5.     -> SELECT F.numero, 'Fraude' Estado, F.fecha_alta
  6.     -> FROM prepago P INNER JOIN fraude F ON P.numero = F.numero
  7.     -> WHERE F.numero = 123456
  8.     -> UNION
  9.     -> SELECT PO.numero, 'Portabilidad' Estado, PO.fecha_alta
  10.     -> FROM prepago P INNER JOIN portabilidad PO ON P.numero = PO.numero
  11.     -> WHERE PO.numero = 123456;
  12. +--------+--------+------------+
  13. | numero | Estado | fecha_alta |
  14. +--------+--------+------------+
  15. | 123456 | Fraude | 2015-04-30 |
  16. +--------+--------+------------+
  17. 1 row in set (0.00 sec)

El comportamiento de las consultas depende de como se contruyan los datos, y como la realcies.
__________________
¿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; 20/06/2015 a las 11:11