Ver Mensaje Individual
  #5 (permalink)  
Antiguo 03/08/2011, 20:33
Henkka
 
Fecha de Ingreso: abril-2008
Ubicación: Santa Fe, Argentina
Mensajes: 41
Antigüedad: 16 años, 7 meses
Puntos: 14
Respuesta: Combinar dos tablas en una

Cita:
Iniciado por d4ri0 Ver Mensaje
Sino creo que no sirve de nada tener otra tabla más con los datos duplicados.
Se llaman vistas y se pueden programar directamente en el DBMS. Su uso es esotérico, por no encontrar una mejor palabra.

Suponiendo que tenemos los siguientes datasets

Código:
mysql> SELECT * FROM llamadas;
+-----------+-----------+----------+
| idcliente | discado   | duracion |
+-----------+-----------+----------+
|         1 | 005113349 |       70 |
|         1 | 005121122 |       50 |
|         1 | 005121123 |       40 |
|         2 | 005132321 |       90 |
|         2 | 005123344 |      120 |
|         3 | 005123411 |       40 |
+-----------+-----------+----------+
Código:
mysql> SELECT * FROM tarifas;
+---------+---------+-------+
| prefijo | destino | valor |
+---------+---------+-------+
| 00511   | Lima    |     5 |
| 00512   | Bagua   |     7 |
| 00513   | Bolivar |     3 |
+---------+---------+-------+
Procedemos a crear una vista que muestre el cliente, el número discado, la provincia de destino y la duración y valor de la llamada. Empezamos armando el select que va a utilizar la vista

Código:
mysql> SELECT idcliente, discado, destino, duracion, (duracion * valor) AS costo FROM llamadas LEFT JOIN tarifas ON LEFT(discado, LENGTH(prefijo)) = prefijo ORDER BY idcliente;
+-----------+-----------+---------+----------+-------+
| idcliente | discado   | destino | duracion | costo |
+-----------+-----------+---------+----------+-------+
|         1 | 005113349 | Lima    |       70 |   350 |
|         1 | 005121122 | Bagua   |       50 |   350 |
|         1 | 005121123 | Bagua   |       40 |   280 |
|         2 | 005123344 | Bagua   |      120 |   840 |
|         2 | 005132321 | Bolivar |       90 |   270 |
|         3 | 005123411 | Bagua   |       40 |   280 |
+-----------+-----------+---------+----------+-------+
Luego creamos la vista con esa consulta

Código:
CREATE VIEW reporte AS SELECT idcliente, discado, destino, duracion, (duracion * valor) AS costo FROM llamadas LEFT JOIN tarifas ON LEFT(discado, LENGTH(prefijo)) = prefijo ORDER BY idcliente;
Y procedemos a ver qué resulta

Código:
mysql> SELECT * FROM reporte;
+-----------+-----------+---------+----------+-------+
| idcliente | discado   | destino | duracion | costo |
+-----------+-----------+---------+----------+-------+
|         1 | 005113349 | Lima    |       70 |   350 |
|         1 | 005121122 | Bagua   |       50 |   350 |
|         1 | 005121123 | Bagua   |       40 |   280 |
|         2 | 005123344 | Bagua   |      120 |   840 |
|         2 | 005132321 | Bolivar |       90 |   270 |
|         3 | 005123411 | Bagua   |       40 |   280 |
+-----------+-----------+---------+----------+-------+
Esto nos sirve para calcular al vuelo, por ejemplo, cuanto tarifar a un cliente

Código:
mysql> SELECT idcliente, SUM(costo) FROM reporte GROUP BY idcliente;
+-----------+------------+
| idcliente | SUM(costo) |
+-----------+------------+
|         1 |        980 |
|         2 |       1110 |
|         3 |        280 |
+-----------+------------+