Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

una manera mejor de hacer esta consulta

Estas en el tema de una manera mejor de hacer esta consulta en el foro de Mysql en Foros del Web. Hola partiendo de dos tablas, una con nombres prioritarios y la otro empresa, lo que necesito es sacar los datos de la tabla empresas pero ...
  #1 (permalink)  
Antiguo 16/12/2014, 06:40
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
una manera mejor de hacer esta consulta

Hola partiendo de dos tablas, una con nombres prioritarios y la otro empresa, lo que necesito es sacar los datos de la tabla empresas pero que sus nombres esten en la tabla nombre prioritarios, a mi solo se me ocurre con dos consultas una para extraer los nombres prioritarios y despues con los identificador extraer los datos en la tabla empresa, pero no se si se podria hacer de una sola consulta, o de que manera es mejor hacer esto?
alguna ayuda?
saludos.
  #2 (permalink)  
Antiguo 16/12/2014, 06:43
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: una manera mejor de hacer esta consulta

Normalmente eso se hace con un INNER JOIN, pero para eso las tablas que mencionas deben estar relacioandas por FK... ¿Existe alguna relación entre ambas?
Postea la query como la teines ahora (y si no la tienes, intenta una), y veremos por donde va la cosa.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 16/12/2014, 06:58
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: una manera mejor de hacer esta consulta

Hola gnzsoloyo, la relacion que tendria seria el nombre.

SELECT id FROM nombres_prioritarios

esta seria para recuperar los id

SELECT * FROM empresa WHERE id=id

Esta seria la segunda consulta con los array de la primera, evidentemente de esta manera necestiaria programar, pero como bien dices si es posible con una sola consulta me gustaria saber como se hace, saludos.
  #4 (permalink)  
Antiguo 16/12/2014, 07:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: una manera mejor de hacer esta consulta

Cita:
Hola gnzsoloyo, la relacion que tendria seria el nombre.
Incorrecto. La relación que estás mostrando en esas dos queries es por ID, no por nombre. El nombre es lo que quieres obtener, pero no lo que los relaciona.

Si lo que meustras es correcto, la relación se indicaría asi:

Código MySQL:
Ver original
  1. SELECT E.id, NP.nombre
  2. FROM empresa  E INNER JOIN nombres_prioritarios NP ON E.id = NP.id
Eso devovlería un único registro por cada Empresa, con el nombre prioritario asociado, siempre y cuando hubiese un único nombre prioritario por cada empresa.
Eso ya dependerá de lo bien que tengas diseñada la base y como estén de consistentes los datos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 16/12/2014, 07:51
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: una manera mejor de hacer esta consulta

Perdona esque me he equivocado las consultas serian asi:

consulta para recuperar nombres prioritarios

SELECT nombre FROM nombres_prioritarios

esta seria para recuperar los datos de empresa

SELECT * FROM empresa WHERE nombre=nombre

es decir que los nombres de la tablas prioritarios son unicos pero los datos de la tabla empresa pueden haber algunos datos repetidos pero tengo que recuperarlos todos los nombres y si hay repetidos tambien.

Pongo la query partiendo de tu explicacion haber si es correcta:

Código MySQL:
Ver original
  1. SELECT E.nombre, NP.nombre
  2. FROM empresa  E INNER JOIN nombres_prioritarios NP ON E.nombre = NP.nombre
  #6 (permalink)  
Antiguo 16/12/2014, 07:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: una manera mejor de hacer esta consulta

¿Y ya la probaste?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 16/12/2014, 08:03
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: una manera mejor de hacer esta consulta

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Y ya la probaste?
No me hace falta probarla se que funciona correctamente, pero lo que no consigo es saber como puedo usar COUNT en esta misma consulta.

Yo probe algo asi:

Código MySQL:
Ver original
  1. SELECT E.nombre, NP.nombre COUNT(E.nombre) AS contador
  2.     FROM empresa E INNER JOIN nombre_prioritario NP ON E.email = NP.email

pero no funciona.
  #8 (permalink)  
Antiguo 16/12/2014, 08:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: una manera mejor de hacer esta consulta

No estás agrupando...
Te debe estar dando un error de ejhecución.

Usa GROUP BY sobre el primer campo del SELECT y obtendrás lo que necesitas (es de manual basico).

Nota: No es necesario el "AS", es obsoleto y sólo sirve para poner basura en el código.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 16/12/2014, 08:33
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: una manera mejor de hacer esta consulta

Hice esto pero no me da el resultado esperado:

Código MySQL:
Ver original
  1. SELECT E.nombre, NP.nombre
  2.         FROM empresa E INNER JOIN nombre_prioritario NP ON E.nombre= NP.nombre GROUP BY E.nombre

De todas formas estoy probanda la primera consulta y tampoco me da los resultados esperados, quiero que me muestro todos los registros de la tabla empresa donde el nombre sea igual en las dos tablas relacioandas hice algo asi:

Código MySQL:
Ver original
  1.         FROM empresa E INNER JOIN nombre_prioritario NP ON E.nombre= NP.nombre

Pero resulta que me muestra los registros duplicados y solo quiero que me muestro los registros de la tabla empresa, que estoy haciendo mal?
  #10 (permalink)  
Antiguo 16/12/2014, 08:59
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: una manera mejor de hacer esta consulta

Al final funciona todo bien era que tenia datos repetidos en la tabla de nombres prioritarios, gracias por tu colaboracion, saludos.
  #11 (permalink)  
Antiguo 16/12/2014, 09:09
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
usar inner join con match

Hola no es si es posible, comento un poco haber si es posible, tengo una tabla con palabras de busqueda, y otra tabla con con distintos perfiles donde con las palabras de la primera tengo que buscar en la tabla perfiles, para esto quiero usar MATCH con INNER JOIN si esque se puede las tablas serian algo asi:

palabras
id_palabra
palabra




perfiles
id_perfil
descripcion


Seria buscar en la tabla pefiles todos los registros que contengan alguna de las palabras de la tabla palabras y la verdad no tengo ni idea de como se puede hacer esto si esque se puede.
Alguna idea de como empezar a construir esta consulta?
saludos
  #12 (permalink)  
Antiguo 16/12/2014, 10:38
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: una manera mejor de hacer esta consulta

Perdonar si cree otro post pense que deberia hacerlo ya que son consultas diferentes, bueno volviendo al post, no encuentro informacion para unir dos tablas de esta estructura con match, solo se me ocurre una solucion programando, si alguien me dice si es posible o no crear una sola consulta para este tipo de busquedas se lo agradeceria, saludos.
  #13 (permalink)  
Antiguo 16/12/2014, 10:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: una manera mejor de hacer esta consulta

MATCH() no apunta a usarse en FROM
Es una condición para el WHERRE, donde aplica mejor.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 16/12/2014, 12:39
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: una manera mejor de hacer esta consulta

Hola la consulta sin usar inner join que uso seria esta:
Código MySQL:
Ver original
  1. SELECT descripcion, MATCH (descripcion) AGAINST ('palabra a buscar' in boolean mode)
  2. AS busqueda FROM perfiles
  3. WHERE MATCH (descripcion) AGAINST ('palabra a buscar' in boolean mode) order by id

Osea uso dos Match y no consigo unir la tabla palabras para buscar todas las búsquedas que coincidan con las palabras de dicha tabla. Alguna ayuda por favoz.
  #15 (permalink)  
Antiguo 17/12/2014, 01:13
 
Fecha de Ingreso: enero-2011
Mensajes: 1.150
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: una manera mejor de hacer esta consulta

Nadie me confirma si es posible hacer esta consulta? Algo como esta consulta, que evidentemente no funciona pero no se si tengo alguna alternativa para recuperar los registros que necesito.

TABLAS

palabras
id_palabra
palabra

perfiles
id_perfil
descripcion
Código MySQL:
Ver original
  1. SELECT descripcion  FROM perfiles P INNER JOIN palabras P
  2.     WHERE MATCH (descripcion) AGAINST (P.palabra in boolean mode) order by id_perfil

Nadie me puede confirmar si en el parametro de AGAINST se le puede pasar la palabra de busqueda de una tabla en este caso de la tabla palabras?
saludos

Última edición por azaz; 17/12/2014 a las 04:54
  #16 (permalink)  
Antiguo 17/12/2014, 06:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: una manera mejor de hacer esta consulta

Tienes que entender la idea central del MATCH() AGAINST(): Sólo funciona si:
1) Las palabra son palabras completas de cinco o más caracteres.
2) Existe un índice FULLTEXT que se defina por todas las columnas donde se hará la búsqueda.
3) Si el servidor de MySQL no es una versión 5.6 o superior, no funcionará con tablas InnoDB, sino sólo con las MyISAM.

MATCH() AGAINST() realiza comparaciones jerarquizadas por relevancia, lo que implica que devolverá aquellos registros donde las palabras buscadas se encuentren todas o una parte de ellas, ponderando la aparicion de esas palabras en las columnas contra las que se compara.
No busca por patrones, por lo que no sirve si los datos buscados son parciales.
Tampoco es eficiente para comparar textos mayores, ya que podrían no sólo bloquear al servidor al tener que ponderar demasiados datos, o no devolver nada, porque la ponderación tienda a cero dada la longitud de los textos a comparar.

Por otro lado a ese INNER JOIN le falta el ON y la condición de coincidencia que no debe ser el MATCH() AGAINST() porque los resultados erán erróneos.
Una relación por JOIN tiene que ser una relación segura, no una aproximación. de lo contrari opodrías obtener un producto cartesiano, lo que es el peor escenario posible de una consulta.

¿Queda más claro?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: join, manera, match, registro, tabla, usar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:27.