elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  Seleccionar datos únicos, comparar con otra base, dos consultas
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Seleccionar datos únicos, comparar con otra base, dos consultas  (Leído 18,204 veces)
дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
*
Desconectado Desconectado

Mensajes: 5.110


Ver Perfil WWW
Re: Seleccionar datos únicos, comparar con otra base, dos consultas
« Respuesta #10 en: 15 Diciembre 2009, 19:19 pm »

Paso a explicarles  :)

Tengo exactamente 5 bases de datos en MySql a las cuales les podríamos llamar "mimi-bases", las cuales contienen registros de clientes:

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

Ahora, esas 5 bases de datos tienen los registros del 1 al 2000 (mini-base 1), 2000 al 4000 (mini-base 2) y asi consecutivamente.

Tengo una base de datos (que podemos llamar mamá) que concentra las 5 mini-bases, la tarea era obtener los codigos de promocion (campo codigodepromocion) únicos de la base de datos "mamá" (resuelto con DISTINTC), y a su vez ya teniendo una base de datos "pura" (ya que muchos se repiten), buscar los registros que estén en las bases de datos que tengan en el campo codigousado = NO.

Gracias  :)




En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: Seleccionar datos únicos, comparar con otra base, dos consultas
« Respuesta #11 en: 15 Diciembre 2009, 19:30 pm »

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????


En línea

дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
*
Desconectado Desconectado

Mensajes: 5.110


Ver Perfil WWW
Re: Seleccionar datos únicos, comparar con otra base, dos consultas
« Respuesta #12 en: 15 Diciembre 2009, 20:47 pm »

Citar
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????

Yep.

Citar
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????

Así es, también existe en las otras, están homologadas.

Gracias  :D
En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: Seleccionar datos únicos, comparar con otra base, dos consultas
« Respuesta #13 en: 15 Diciembre 2009, 21:06 pm »

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'
En línea

дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
*
Desconectado Desconectado

Mensajes: 5.110


Ver Perfil WWW
Re: Seleccionar datos únicos, comparar con otra base, dos consultas
« Respuesta #14 en: 16 Diciembre 2009, 00:23 am »

Hola Tifa, muchas gracias por tu interés y ayuda.

Me quedaría con los registros de la base "mamá", en cuanto a referencia indentica también la hay ya que es un entero de 16 caracteres único. Precisamente por eso nencesito filtrarlos, para quedarme con los códigos NO usados. Probaré la query y os cuento.

Gracias, Alfonso.
En línea

дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
*
Desconectado Desconectado

Mensajes: 5.110


Ver Perfil WWW
Re: Seleccionar datos únicos, comparar con otra base, dos consultas
« Respuesta #15 en: 16 Diciembre 2009, 00:29 am »

Igual y me van a querer matar  ;D pero no son bases, son tablas jeje.  :-\ perdón.
En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: Seleccionar datos únicos, comparar con otra base, dos consultas
« Respuesta #16 en: 16 Diciembre 2009, 00:32 am »

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.
En línea

дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
*
Desconectado Desconectado

Mensajes: 5.110


Ver Perfil WWW
Re: Seleccionar datos únicos, comparar con otra base, dos consultas
« Respuesta #17 en: 16 Diciembre 2009, 00:47 am »

Tifa, tienes razón, las tablas tienen la siguiente estructura:

Código:
mysql> DESCRIBE clientesconcentrada;
+-----------------------+------------------+------+-----+---------+----------------+
| Field                 | Type             | Null | Key | Default | Extra          |
+-----------------------+------------------+------+-----+---------+----------------+
| id_clientes           | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| id_tienda             | int(10) unsigned | NO   |     | NULL    |                |
| nombre        | varchar(255)     | YES  |     | NULL    |                |
| codigodepromocion     | int(16)          | YES  |     | NULL    |                |
| codigousado           | varchar(255)     | YES  |     | NULL    |                |
| registro              | date             | YES  |     | NULL    |                |
+-----------------------+------------------+------+-----+---------+----------------+

Ya extraí todos los registros que me resultaron del DISTINCT (de la tabla clientesconcentrada [mamá]), la tabla se llama clientesfiltrados, estas filas son únicas (diferenciandolas mediante el código de promoción), las cuales tengo que comparar con las otras tablas y ver cuales tienen en codigousado = no.

Esto es para ver que códigos están sin usar.

Gracias!!
En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: Seleccionar datos únicos, comparar con otra base, dos consultas
« Respuesta #18 en: 16 Diciembre 2009, 01:55 am »

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
  1.  
  2. mysql> SELECT * FROM clientesfiltrados;
  3. +-------------+-------------------+-------------+
  4. | id_clientes | codigodepromocion | codigousado |
  5. +-------------+-------------------+-------------+
  6. |           1 |              8888 | no          |
  7. |           2 |              6464 | si          |
  8. |           3 |              7373 | no          |
  9. |           4 |              6565 | si          |
  10. +-------------+-------------------+-------------+
  11. 4 ROWS IN SET (0.00 sec)
  12.  
  13. mysql> SELECT * FROM clientesconcentrada;
  14. +-------------+-----------+--------+-------------------+-------------+
  15. | id_clientes | id_tienda | nombre | codigodepromocion | codigousado |
  16. +-------------+-----------+--------+-------------------+-------------+
  17. |           1 |         1 | Maria  |              8080 | no          |
  18. |           2 |         1 | Jose   |              9090 | si          |
  19. |           3 |         1 | Juan   |              7070 | no          |
  20. |           4 |         1 | Lucas  |              6060 | si          |
  21. +-------------+-----------+--------+-------------------+-------------+
  22. 4 ROWS IN SET (0.00 sec)
  23.  
  24.  

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
  1.  
  2. 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';
  3. +--------------------+-----------------+
  4. | Codigo_Concentrada | Codigo_Filtrado |
  5. +--------------------+-----------------+
  6. |               8080 |            8888 |
  7. |               7070 |            7373 |
  8. +--------------------+-----------------+
  9. 2 ROWS IN SET (0.00 sec)
  10.  
  11.  

Donde:

Código
  1.  
  2. mysql> SELECT codigodepromocion FROM clientesconcentrada WHERE codigousado = 'no';
  3. +-------------------+
  4. | codigodepromocion |
  5. +-------------------+
  6. |              8080 |
  7. |              7070 |
  8. +-------------------+
  9. 2 ROWS IN SET (0.00 sec)
  10.  
  11.  

Y donde:

Código
  1.  
  2. mysql> SELECT codigodepromocion FROM clientesfiltrados WHERE codigousado = 'no';
  3. +-------------------+
  4. | codigodepromocion |
  5. +-------------------+
  6. |              8888 |
  7. |              7373 |
  8. +-------------------+
  9. 2 ROWS IN SET (0.00 sec)
  10.  
  11.  

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

Código
  1.  
  2. 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';
  3.  
  4.  


En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: Seleccionar datos únicos, comparar con otra base, dos consultas
« Respuesta #19 en: 16 Diciembre 2009, 02:27 am »

Se me paso decirte, pero de consejo esto:

Citar
mysql> DESCRIBE clientesconcentrada;
+-----------------------+------------------+------+-----+---------+----------------+
| Field                 | Type             | Null | Key | Default | Extra          |
+-----------------------+------------------+------+-----+---------+----------------+
| id_clientes           | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| id_tienda             | int(10) unsigned | NO   |     | NULL    |                |
| nombre               | varchar(255)     | YES  |     | NULL    |                |
| codigodepromocion     | int(16)          | YES  |     | NULL    |                |
| codigousado           | varchar(255)     | YES  |     | NULL    |                |
| registro              | date             | YES  |     | NULL    |                |
+-----------------------+------------------+------+-----+---------+----------------+

el campo nombre le asignaste una longitud varchar de 255  :-\  (Que nombre te ocuparia tanto espacio) lo mismo con codigousado que me informaste que solo guarda 2 registros o 'si' o 'no' sin embargo tambien tiene una longitud 255 en varchar  :-\  seria suficiente que alteraras la o las tablas con estos respectivos valores por  codigousado char(3)  y nombre varchar(50) tambien recuerda no permitir ni dejar valores NULL insertarse en la tabla  ;)
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
actualizacion de datos con index FOREIGN KEY, (consultas)
PHP
DJmixmancar 0 2,077 Último mensaje 5 Diciembre 2010, 08:05 am
por DJmixmancar
Dos Consultas una de VLC y otra de...
Software
Bender-Deicide 1 1,694 Último mensaje 31 Diciembre 2010, 21:33 pm
por RyogiShiki
Cómo Seleccionar un dato si existe en otra tabla?
Bases de Datos
WHK 4 6,363 Último mensaje 26 Agosto 2013, 17:56 pm
por 1mpuls0
selecciónar imágenes y almacenar en una base de datos
Programación Visual Basic
iamdevatamer@gmail.com 3 1,855 Último mensaje 30 Julio 2015, 19:04 pm
por 79137913
[Pregunta]: Consultas periódicas a una base de datos con PHP.
PHP
Leguim 6 6,614 Último mensaje 25 Mayo 2021, 04:36 am
por Leguim
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines