|
Página 1 de 2
|
Consulta "query" SQL [SOLUCIONADO]
Autor |
Mensaje |
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
Consulta "query" SQL [SOLUCIONADO]
Hola
Esta consulta va especialmente dirigida al maestro de las bases de datos, nuestro amigo shordi.
Tengo una base de datos MySQL con algunas tablas, las que me interesan para esto son las que se ven en la imagen:
La consulta que uso hasta ahora es algo como:
SELECT `nr`,`call`,`freq`,`dxcall`,`comment`,`time`,`band` FROM spots WHERE band = '6' ORDER BY time DESC LIMIT 30;
Esta tabla, spots, se está llenando en tiempo real desde una conexión telnet usando un script perl, pero necesito obtener el valor de un campo de la tabla c_locator a partir del campo call y dxcall (son campos diferentes, pero almacenan el mismo tipo de dato) de la tabla spots
Lo que quiero es crear una consulta cruzada entre las tablas spots y c_locator, teniendo en cuenta que los campos de spots call y dxcall contienen una cadena que podría hallarse en la tabla c_locator, de la que comparando primero cada campo citado con callsign, me debe devolver el resultado de lo que contenga loc.
Es decir, ¿hay alguna manera de obtener c_locator.loc a partir de spots.call y spots.dx.call sólo usando sql para devolver esos campos en la consulta junto a los otros?
Además me interesa que la tabla maps se actualice con los resultados de esa consulta.
No se si me he explicado bien... en cualquier caso estoy seguro de que se puede diseñar mejor la bd (de hecho estoy viendo diferencias en el tamaño de campos semejantes), pero hay que tener en cuenta que como hay dos campos teóricamente iguales, aunque con diferente contenido en cada registro, no puedo establecer relaciones entre las tablas, o eso creo
Saludos
=================== Jesús Guardón
Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".
"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
|
#1 Viernes, 05 Abril 2013, 22:36 |
|
|
angelnu
Angel
Programador
Registrado: Septiembre 2009
Mensajes: 106
Edad: 61 Ubicación:
|
Re: Consulta "query" SQL
Prueba con
SELECT `s.nr`,`s.call`,`s.freq`,`s.dxcall`,`s.comment`,`s.time`,`s.band` , `c.loc` FROM spots AS s
INNER JOIN `c_locator ` AS c ON `c.loc`= `s.clall` OR `c.loc`= `s.dx`
AND s.band = '6' ORDER BY time DESC LIMIT 30;
Creo que algo parecido es lo que quieres, lo que no se es el tipo de unión que quieres entre las dos tablas
|
#2 Sabado, 06 Abril 2013, 07:44 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
Re: Consulta "query" SQL
Gracias por tu tiempo Angelnu, pero no funciona. Hay errores en la consulta, que una vez eliminados tampoco producen el resultado esperado.
De todas formas estoy dando vueltas al asunto, y quizás sea mejor emplear procedimientos almacenados, porque realmente no estoy seguro si la consulta en sí misma es posible... Ten en cuenta que aquí quiero matar dos pájaros de un tiro, y es que mientras que quiero facilitar la consulta combinada de las dos tablas, también necesito que parte de los resultados se inserten en la tercera tabla.
No sé si será descabellado lo que digo, teniendo en cuenta que la tabla spots se llena razón de unos 2000 registros diarios (aunque registros más antiguos de 3 meses se vayan eliminando, y la tabla maps se va borrando a razón de antigüedad mayor de 1 hora.
Todo esto en la actualidad se realiza mediante consultas sencillas y código, pero la idea era delegar estas operaciones a la base de datos para automatizar todo en lo posible y liberar trabajo y código a la aplicación.
Repito que seguramente será necesario hacer cambios en la estructura de las tablas, pero esa es la idea básica.
Aquí un extracto del contenido de las 3 tablas:
Tabla spots
Tabla c_locator
Y tabla maps
Saludos
=================== Jesús Guardón
Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".
"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
|
#3 Sabado, 06 Abril 2013, 09:02 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Consulta "query" SQL
Jesús:
Esto.¿ Qué aplicación usaste para ver las tablas como las has mostrado ?.
Con esto supongo que se puede ver visualmente las relaciones.¿ Es valido para Sqlite o solo para MySQL ?.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#4 Sabado, 06 Abril 2013, 09:08 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
Re: Consulta "query" SQL
La primera con phpmyadmin del servidor, los extractos con un programa que se llama DBeaver, y es muy bueno porque permite conexiones a servidores remotos y muchas otras cosas. Pero muy a mi pesar está escrita en Java y no me gustan las aplicaciones en Java!!
http://dbeaver.jkiss.org/
Saludos
=================== Jesús Guardón
Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".
"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
|
#5 Sabado, 06 Abril 2013, 09:28 |
|
|
angelnu
Angel
Programador
Registrado: Septiembre 2009
Mensajes: 106
Edad: 61 Ubicación:
|
Re: Consulta "query" SQL
Resulta muy difícil ayudar sin comprender la organización y utilización de las tablas
Yo creo que no se puede hacer una consulta de selección y una consulta de inserción al mismo tiempo.
Citar: Ten en cuenta que aquí quiero matar dos pájaros de un tiro, y es que mientras que quiero facilitar la consulta combinada de las dos tablas, también necesito que parte de los resultados se inserten en la tercera tabla.
Prueba a hacer una subconsulta para obtener los datos y después hacer el INSERT en la otra tabla.
No se si es adecuado utilizar triggers o funciones en tu bd.
Yo particularmente delego muchas operaciones a la Bd (agrupo albaranes en facturas con una función, triggers para cuando se actualiza un dato cambia datos en varias tablas etc.)
|
#6 Sabado, 06 Abril 2013, 11:14 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
Re: Consulta "query" SQL
Resulta muy difícil ayudar sin comprender la organización y utilización de las tablas
Lo sé, lo sé... he tratado de mostrar todos los detalles posibles, pero aún así entiendo que es difícil comprender el uso. Sin embargo, creo que voy a estudiar la posibilidad de usar triggers o procedimientos para la inserción en la tercera tabla, aparte de una mejor organización. Pero sigo buscando la forma de hacer la consulta inicial combinando las tabas spots y c_locator, ya que es la base para luego poder insertar en la otra. Probaré con subconsultas... qué lío!
Para complicar las cosas aún más, resulta que el sistema está en producción, así que voy a tener que hacer un sistema paralelo hasta que funcione y luego eliminar el viejo.
Gracias por tus consejos
=================== Jesús Guardón
Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".
"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
|
#7 Sabado, 06 Abril 2013, 11:30 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Consulta "query" SQL
Ante todo, gracias por el título, pero me temo que no es merecido,
Después, no me gusta nada la estructura de tablas que planteas... pero, sin entrar a cambiarla tengo algunas dudas:
1. ¿En call y dxcall pueden haber valores duplicados? es decir, que (call y dxcall contengan lo mismo)
2.-Si los dos campos contienen datos requeridos(que existan ambos en c_locator) ¿se debe generar un registro en maps o dos? Si es sólo uno ¿cuál de los dos tiene preferencia?
3.-¿Que motor de datos usas en MySQL: MyIsam, InnoDB?
Creo que esí es posible, pero depende de estas cosas....
Saludos.
última edición por shordi el Sabado, 06 Abril 2013, 12:56; editado 1 vez
|
#8 Sabado, 06 Abril 2013, 12:55 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Consulta "query" SQL
Uf, yo había leído maestro de las tablas.
Así que Shordi es como Moises.Anda para que digas luego que no te va el rollo de la religión.
Siempre ha demostrado tener "muchas tablas" con las base de datos.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#9 Sabado, 06 Abril 2013, 13:23 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
Re: Consulta "query" SQL
Ante todo, gracias por el título, pero me temo que no es merecido,
Después, no me gusta nada la estructura de tablas que planteas... pero, sin entrar a cambiarla tengo algunas dudas:
A mi tampoco, pero llevan mucho tiempo hechas y se han ido añadiendo cosas con el tiempo. Ahora es el momento de arregarlo, jeje.
1. ¿En call y dxcall pueden haber valores duplicados? es decir, que (call y dxcall contengan lo mismo)
Sí, pueden haber valores duplicados. Piensa en ambos campos como si fueran nombres de personas.
Por otra parte, la tabla c_locator contiene callsign y loc como campos, de los cuales callsign es único y loc puede tener dupes.
Esta tabla spots es muy dinámica, entran unos 100 registros a la hora y se deben borrar los que superen cierta antigüedad. El número medio de registros es 150000.
Piensa en esta tabla como un listín telefónico, a cada valor de callsign le corresponde un loc. Lo que es lo mismo, si empleamos la suposición anterior: a cada nombre le corresponde un teléfono. (Aunque el ejemplo no es muy acertado, pues no hay telefonos duplicados en la vida real, tendríamos que pensar que vive mucha gente en la misma casa compartiendo teléfono, jajaja).
Esta tabla es prácticamente estática, conteniendo 1,3 millones de registros.
Como los campos call y dxcall contienen "nombres", hay que buscar el "teléfono" en el listín, o sea la tabla c_locator
2.-Si los dos campos contienen datos requeridos(que existan ambos en c_locator) ¿se debe generar un registro en maps o dos? Si es sólo uno ¿cuál de los dos tiene preferencia?
Sucede que en los registros que van entrando a la tabla spots, puede ocurrir que alguno de los dos campos call y dxcall no se encuentre en la tabla c_locator. Sólo cuando se encuentre alguna coincidencia en ambos, es decir, completemos las dos parejas de call->loc y dxcall->loc, podríamos insertar datos en la tercera tabla maps, junto a la hora del registro y la banda.
Es decir, solo un registro por cada registro de la tabla spots que cumpla esas condiciones. Pero ese registro se inserta en tiempo real, es decir, cada vez que se inserta un spot en la tabla spots se comprueba que las 2 parejas de call/locator se pueden realizar y se inserta ahora en la tabla maps solo lo que corresponde a ese registro. No se hace para toda la tabla entera.
3.-¿Que motor de datos usas en MySQL: MyIsam, InnoDB?
MyISAM
Creo que esí es posible, pero depende de estas cosas....
Saludos.
Yo ya me he quedado sin ideas, he intentado muchas cosas, pero sin duda debería empezar por estructurar mejor los datos. ¿Qué me aconsejas?
Gracias y saludos
=================== Jesús Guardón
Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".
"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
|
#10 Sabado, 06 Abril 2013, 14:14 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 2
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas No puede adjuntar archivos Puede descargar archivos No puede publicar eventos en el calendario
|
|
|
|
|