Autor
|
Tema: Seleccionar datos únicos, comparar con otra base, dos consultas (Leído 18,204 veces)
|
дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
Desconectado
Mensajes: 5.110
|
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
Mensajes: 2.804
|
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
Mensajes: 5.110
|
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. 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
|
|
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
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
Mensajes: 5.110
|
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
Mensajes: 5.110
|
Igual y me van a querer matar pero no son bases, son tablas jeje. perdón.
|
|
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
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
Mensajes: 5.110
|
Tifa, tienes razón, las tablas tienen la siguiente estructura: 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
Mensajes: 2.804
|
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: 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' 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: mysql> SELECT codigodepromocion FROM clientesconcentrada WHERE codigousado = 'no'; +-------------------+ | codigodepromocion | +-------------------+ | 8080 | | 7070 | +-------------------+ 2 ROWS IN SET (0.00 sec)
Y donde: 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: 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';
|
|
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
Se me paso decirte, pero de consejo esto: 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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
actualizacion de datos con index FOREIGN KEY, (consultas)
PHP
|
DJmixmancar
|
0
|
2,077
|
5 Diciembre 2010, 08:05 am
por DJmixmancar
|
|
|
Dos Consultas una de VLC y otra de...
Software
|
Bender-Deicide
|
1
|
1,694
|
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
|
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
|
30 Julio 2015, 19:04 pm
por 79137913
|
|
|
[Pregunta]: Consultas periódicas a una base de datos con PHP.
PHP
|
Leguim
|
6
|
6,614
|
25 Mayo 2021, 04:36 am
por Leguim
|
|