Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - ^Tifa^

#581
Ok lo que intentas decirme es que todas las tablas tienen los mismos campos los mismos valores y en el unico campo donde se diferencian es en 'codigopromocion'???

Si la respuesta es afirmativa, entonces cree 2 tablas identicas a la que me mostraste pero donde unicamente varian el valor de codigopromocion de cada una:

Código (sql) [Seleccionar]


mysql> select * from clientesfiltrados;
+-------------+-------------------+-------------+
| id_clientes | codigodepromocion | codigousado |
+-------------+-------------------+-------------+
|           1 |              8888 | no          |
|           2 |              6464 | si          |
|           3 |              7373 | no          |
|           4 |              6565 | si          |
+-------------+-------------------+-------------+
4 rows in set (0.00 sec)

mysql> select * from clientesconcentrada;
+-------------+-----------+--------+-------------------+-------------+
| id_clientes | id_tienda | nombre | codigodepromocion | codigousado |
+-------------+-----------+--------+-------------------+-------------+
|           1 |         1 | Maria  |              8080 | no          |
|           2 |         1 | Jose   |              9090 | si          |
|           3 |         1 | Juan   |              7070 | no          |
|           4 |         1 | Lucas  |              6060 | si          |
+-------------+-----------+--------+-------------------+-------------+
4 rows in set (0.00 sec)



Ambas tablas tienen los mismos datos en todos los campos (A excepcion de codigodepromocion como me estas diciendo) Por ende la siguiente consulta SQL seria valida si quieres obtener todos los codigodepromocion (De las 2 tablas en este caso) donde el valor sea 'NO'

Código (sql) [Seleccionar]


mysql> select clientesconcentrada.codigodepromocion as Codigo_Concentrada, clientesfiltrados.codigodepromocion as Codigo_Filtrado from clientesconcentrada inner join clientesfiltrados on (clientesfiltrados.id_clientes = clientesconcentrada.id_clientes) where clientesfiltrados.codigousado = 'no' and clientesconcentrada.codigousado = 'no';
+--------------------+-----------------+
| Codigo_Concentrada | Codigo_Filtrado |
+--------------------+-----------------+
|               8080 |            8888 |
|               7070 |            7373 |
+--------------------+-----------------+
2 rows in set (0.00 sec)



Donde:

Código (sql) [Seleccionar]


mysql> select codigodepromocion from clientesconcentrada where codigousado = 'no';
+-------------------+
| codigodepromocion |
+-------------------+
|              8080 |
|              7070 |
+-------------------+
2 rows in set (0.00 sec)



Y donde:

Código (sql) [Seleccionar]


mysql> select codigodepromocion from clientesfiltrados where codigousado = 'no';
+-------------------+
| codigodepromocion |
+-------------------+
|              8888 |
|              7373 |
+-------------------+
2 rows in set (0.00 sec)



En tu caso que son 5 tablas, haces lo mismo en el JOIN quedando mas o menos:

Código (sql) [Seleccionar]


select clientesconcentrada.codigodepromocion as Codigo_Concentrada, clientesfiltrados.codigodepromocion as Codigo_Filtrado, Mini1.codigodepromocion as Codigo_Mini from clientesconcentrada, clientesfiltrados, Mini1 on (clientesfiltrados.id_clientes = clientesconcentrada.id_clientes)  where Mini1.id_clientes = clientesconcentrada.id_clientes and clientesfiltrados.codigousado = 'no' and clientesconcentrada.codigousado = 'no' and Mini.codigousado = 'no';




#582
A lo mejor es mucho pedir, pero creo que en esa parte Sempus tiene razon no puedo sugerir solucion en base a una idealizacion de un escenario expuesto por ti.

Sino es mucho pedir, podrias describirnos que campos continen la tabla mama y al menos 2 de las mini-base y colocar un ejemplo de los datos que tienen cada tabla y mas o menos la consulta final como te gustaria que salgan para uno tener una idea mas clara de como acomodar la consulta SQL. 

Porque por ejemplo si yo tuviera 2 tablas (me voy a basar en 2 tablas en este ejemplo):

Tabla mama:

id_cliente INT
nombre CHAR
id_tienda INT
codigodepromocion INT
codigousado CHAR [aqui le pongo si o no]
registro DATE

Tabla Mini1

id_cliente INT
mensaje varchar(100)
codigousado CHAR [aqui le pongo si o no]


Si en tu caso que solo te interesan los registros de la tabla 'mama' no seria necesario comparar el campo codigousado de 'mama' con codigousado de 'Mini1' ya que si solo son los registros de 'mama' bastaria con un simple:

SELECT ...FROM 'mama' WHERE codigousado = 'NO'

Ahora, si tu quisieras vamos a suponer el registro nombre de la tabla 'mama' y el registro mensaje de la tabla 'Mini1' (suponiendo como ejemplo ) entonces ahi si, habria que dar un uso de JOIN con 'mama' y todas las tablas 'Mini1' y decir que codigousado = 'SI' en todas las tablas relacionadas en el JOIN o sea:

mama.codigousado = 'SI' AND Mini1.codigousado = 'SI' AND Mini2.codigousado = 'SI'

Y asi sucesivamente... pero ten en cuenta que no basta solamente con la expresion anterior, si las tablas fueron disenadas relacionandose una con la otra, en algun punto deberan concordar o ser identicas en el valor, entonces aqui entraria las primary key o indice de cada tabla del JOIN, quedando mas o menos tu consulta final con:

mama.codigousado = 'SI' AND Mini1.codigousado = 'SI' AND Mini2.codigousado = 'SI' AND Mini1.id_client = mama.id_client AND Mini2.id_client = mama.id_client

De lo contrario tendrias un producto cartesiano y datos no muy correctos del todo... por eso es importante en caso que no llegues a una solucion, poder ver parte (Aunque sean 5 lineas de registros) de los campos que poseen la tabla 'mama' y los hijos que quieres relacionarle.
#583
Ok... pero, los registros finales que quieres obtener solo son los campos de la tabla 'mama' o quieres obtener otros campos que pertenecen a las 5 mini-tablas???? Si fuera mas o menos lo anterior expuesto, seria algo tipo:

SELECT DISTINCT mama.nombre, mini1.id_tienda, mini2.id_cliente FROM mama, mini1, mini2 WHERE mama.codigousado NOT IN( select mini1.codigousado FROM mini1 WHERE codigousado = NO ) AND mini1.codigousado NOT IN( selectt mini2.codigousado FROM mini2 WHERE codigousado = NO) AND mini1.id_cliente = mama.id_cliente AND mini2.id_cliente = mini1.id_cliente

No lo he probado, pero deberia ser algo similar a lo anterior.

Pero primero necesito saber si realmente existe referencia real identica entre  el campo codigousuario de 'mama' y las tablas 'minis'
#584
Haber tu base de datos 'mama' tiene esto:

id_cliente INT
nombre CHAR
id_tienda INT
codigodepromocion INT
codigousado CHAR [aqui le pongo si o no]
registro DATE

Y la consulta que realizaste con DISTINCT lo hiciste unicamente consultando a la tabla 'mama' o tuviste que comparar los datos de 'mama' con las 5 mini-bases????

La consulta que quieres donde debas retornar todos los registros del campo codigousado=NO es unicamente sobre la tabla 'mama'? o dicho campo codigousado tambien existe en las otras 5 mini-bases y quieres obtener el resultado de 'mama' y las 5 mini-bases en 1 sola consulta SQL donde el campo codigousado=NO en la tabla 'mama' y las 5 mini-bases????
#585
Bases de Datos / Re: Duda en consulta
15 Diciembre 2009, 18:26 PM
Citarque curioso, a mi tambien se me ocurrio lo de la vista xD ,pero la deseche porque no estara siempre actualizada

Recuerda corazon que la vista sencillamente es una tabla virtual no existe fisicamente, sus datos siempre reflejan lo que las tablas padres que lo componen posee. Por ende si se elimina, actualiza, inserta algun dato en un campo de la tabla padre, dicho campo tendra automaticamente la misma modificacion en la vista  ;)

Creo que con la vista creada ya es mas facil porke basaria 1 sola consulta siempre sobre la vista y asi obtendria lo que busca de manera siempre actualizada.
#586
No chico como crees  :D  entiendo tu punto completamente, porque es valido... pero puestos que el dijo pidio eso desde un principio 'datos unicos que no se reflejen en las demas tablas' supuse lo que supuse....

Porque si fuese por lo que comentas (Que existe de hecho ese estructurado y es valido) entonces, su peticion ya no seria querer datos unicos de la tabla padre que no aparezcan en las demas tablas hijos.

Todo depende lo que el exponga, porque me he basado en una peticion vaga he deducido en base a esa peticion, pero si viera al menos ejemplo o modelo de las tablas, podria deducir de mejor manera realmente que es lo que el desea obtener.
#587
Bases de Datos / Re: Duda en consulta
15 Diciembre 2009, 17:56 PM
Yo haria una vista y salgo del asunto de siempre tener que obtener el valor en una variable y luego llamarlo... sobretodo porque las variables son temporales, seguido te desconectas del motor el dato volatil se flushea.

Y estar constantemente haciendo 2 consultas (una para asignar valor a la variable otra para llamar ese valor) no lo aplicaria yo pero... para gustos.

Si quieres puedes hacer una vista que se mantendra siempre actualizada a los datos de ambas tablas, ejemplo:

Código (sql) [Seleccionar]


mysql> select usuarios.nombres, count(posts.pid) veces from usuarios inner join posts where usuarios.id = posts.id group by(usuarios.id);
+---------+-------+
| nombres | veces |
+---------+-------+
| pepe    |     6 |
| Juan    |     4 |
| Maria   |     6 |
| Luis    |     2 |
+---------+-------+
4 rows in set (0.00 sec)




Código (sql) [Seleccionar]


mysql> create view vista as select usuarios.nombres as nombre, count(posts.pid) as veces from posts inner join usuarios where usuarios.id = posts.id group by usuarios.id;

mysql> select nombre, veces from vista where veces = ( select max(veces) from vista);
+--------+-------+
| nombre | veces |
+--------+-------+
| pepe   |     6 |
| Maria  |     6 |
+--------+-------+
2 rows in set (0.01 sec)



PD: El ejemplo anterior es basado en mis tablas ejemplos puestas anteriormente.
#588
Sempus, aunque tu teoria es valida. Yo me guie de esto para poder deducir el modelo de las tablas ejemplos que expuse:

CitarTengo 7 bases de datos, con datos del 1 al 1200, 1200 al 2300 y así.. son consecutivos pero están partidos

El dice que son todos los datos son consecutivos pero divididos entre las 7 tablas.

Luego expone:

CitarLa segunda es como puedo obtener las filas que NO estén en las mini bases pero que estén en la base de datos concentrada (ya únicas).

Basandome en lo que el peticiona, 'datos unicos' estoy pensando que no se refiere a datos repetidos y en caso que sean repetidos (relacion de a muchos) deberian obviarse porque ya no son unicos sino que son repetidos.

A lo mejor interprete mal, pero me he guiado de valores consecutivos divididos entre varias tablas, y obtenet datos unicos en la tabla padre que no se repitan en la tablas hijos, y como la tabla padre asumo tiene valores 'unicos' (si esta bien modelado y estructurado el asunto) que se repitan los mismos valores en hijos deberia obviarse y no retornarse en la consulta... o al menos eso he entendido yo por su peticion de datos unicos que aparezcan en la tabla padre y que no matcheen o concuerden en las tablas hijos.
#589
Bases de Datos / Re: Duda en consulta
15 Diciembre 2009, 13:43 PM
Imagina este escenario basandome en lo que tu expones (Sobre tus 2 tablas usuarios y posts):

Código (sql) [Seleccionar]


mysql> select * from usuarios;
+----+--------+
| id | nombre |
+----+--------+
|  1 | pepe   |
|  2 | Mario  |
|  3 | Maria  |
|  4 | Juan   |
|  5 | Jose   |
+----+--------+
5 rows in set (0.00 sec)

mysql> select * from post;
+------+------+--------------------------+
| id   | pid  | mensaje                  |
+------+------+--------------------------+
|    1 |    1 | Me gusta la lluvia       |
|    1 |    1 | La vida es bella         |
|    1 |    1 | Que pais visitar         |
|    2 |    2 | Mi color favorito        |
|    1 |    1 | Tu fruta favorita        |
|    3 |    3 | Me gustan los viernes    |
|    3 |    3 | Dia de mi cumple         |
|    1 |    1 | Que computadora comprar? |
|    1 |    1 | Mi laptop rosa           |
|    4 |    4 | La manzana roja          |
|    4 |    4 | Aprendiendo lotus        |
|    4 |    4 | Viva Oracle              |
|    4 |    4 | Tu comida preferida      |
+------+------+--------------------------+
13 rows in set (0.00 sec)




Ahora quieres saber cuantos mensajes existen en la tabla post que hayan realizado cada usuario de la tabla usuarios.


Código (sql) [Seleccionar]


mysql> select usuarios.nombre, count(post.pid) from post inner join usu
arios where usuarios.id = post.id group by usuarios.id;
+--------+-----------------+
| nombre | count(post.pid) |
+--------+-----------------+
| pepe   |               6 |
| Mario  |               1 |
| Maria  |               2 |
| Juan   |               4 |
+--------+-----------------+
4 rows in set (0.00 sec)



Ahora si tu proposito unicamente es saber que usuario es el que ha realizado la mayoria de posts:

Código (sql) [Seleccionar]



mysql> select usuarios.nombre, count(post.pid) from post inner join usuarios whe
re usuarios.id = post.id group by usuarios.id limit 1;
+--------+-----------------+
| nombre | count(post.pid) |
+--------+-----------------+
| pepe   |               6 |
+--------+-----------------+
1 row in set (0.00 sec)


#590
Con el ejemplo anterior te sirve, aunque la demostracion sea solo con 2 tablas. Cree 6 tables (En tu caso son 7) aunque desconozco en su totalidad que tipo de estructura poseen tus tablas, me imagino si es que tienen alguna relacion las 7 que deben tener 1 o mas campos donde concuerden siempre y asi poder retornar las consultas que macheen. En tu caso quieres todos los registros de una tabla particular donde dicho registro no exista o se repita en las otras 6 tablas. No es complicado mira otro ejemplo pero con mas de 2 tablas.

Código (sql) [Seleccionar]


mysql> select * from ejemplo;
+--------+-------+--------+
| numero | datos | indice |
+--------+-------+--------+
|      1 |     1 |      1 |
|      2 |     2 |      1 |
|      3 |     3 |      1 |
|      4 |     4 |      1 |
|      5 |     5 |      1 |
|      6 |     6 |      1 |
|      7 |     7 |      1 |
|      8 |     8 |      1 |
|      9 |     9 |      1 |
|     10 |    10 |      1 |
|     11 |    11 |      1 |
|     12 |    12 |      1 |
|     13 |    13 |      1 |
|     14 |    14 |      1 |
+--------+-------+--------+
14 rows in set (0.00 sec)

mysql> select * from prueba;
+------+                   
| fid  |
+------+
|    1 |
|    1 |
|    5 |
+------+
3 rows in set (0.00 sec)

mysql> select * from pruebax;
+------+
| id   |
+------+
|    1 |
|    2 |
|    5 |
+------+
3 rows in set (0.00 sec)

mysql> select * from pruebaxx;
+------+
| xid  |
+------+
|    4 |
|    5 |
|    6 |
+------+
3 rows in set (0.00 sec)



mysql> select * from pruebita;
+------+                     
| kid  |                     
+------+
|    4 |
|    7 |
|    8 |
+------+
3 rows in set (0.00 sec)



Por ende tengo 6 tablas, y los datos que me interesan son los de la tabla ejemplo precisamente la fila numeros  que no concuerden con ningun campo de las demas tabls entonces:

Código (sql) [Seleccionar]


mysql> select ejemplo.numero from ejemplo where ejemplo.datos not in( select fid from prueba ) and ejemplo.datos not in( select id from pruebax) and ejemplo.datos not in( select xid from pruebaxx ) and ejemplo.datos not in( select kid from pruebita ) and ejemplo.indice = 1;
+--------+
| numero |
+--------+
|      3 |
|      9 |
|     10 |
|     11 |
|     12 |
|     13 |
|     14 |
+--------+
7 rows in set (0.00 sec)



Analiza bien los registros de las tablas posteadas y comparalos a los registros de otras tablas, veras que solo aparecen aquellos numeros que no se reflejan en ninguna de las 6 tablas solicitadas.