Pregunta:
Fecha: 04-07-2017 13:05:17
(En Español)
Me estado rompiendo la cabeza buscando una solución al siguiente problema.
Tengo una tabla: serviciosplanrealizados
EXPLAIN serviciosplanrealizados

No se si lograré hacerme entender, lo intentare.
Quiero hacer una sola consulta sobre la misma tabla según ciertos criterios.
Si ejecuto individualmente estos 2 Query muestran la información esperada.
Query A:
Mostrar todos los registros donde el campo o atributo Empresa, tecnico, estado, guardia se cumplan
Query B:
Mostrar TODOS los registros donde la palabra impresora se encuentre en el campo o atributo tarea o titulo
Hasta ese punto no hay nada extraño.
Ahora aquí es en donde fracaso; quiero hacer una consulta anidada o subconsulta donde se muestren todos los registros del Query A que contenga el Query B.
Dicho de otra manera, mostrar los registros que la palabra "impresora" este presente en el atributo titulo o tarea con las condicionales del Query A.
Si hago esto,
naturalmente muestran todos los registros cuya palabra "impresora" este contenida en el atributo titulo o tarea y de todas las empresas de todos los técnicos, etc. Es decir toda la tabla completa ya que es afectado por el OR del LIKE '%impresora%' OR titulo LIKE '%impresora% invalidando así las primeras condicionales como empresa, tecnico, etc.
He visto la cláusula IN pero no me ha sido favorable en este caso.
¿Como hago para realizar esa consulta, naturalmente si repetir registros?
Desde ya muchas gracias por la atención.
Que tengan un buen día.
Saludos
Votos: 1 - Respuestas: 4 - Vistas: 20 Compartir en: Google Facebook Twitter LinkedIn Link
Consulta anidada en MySQL en la misma tabla[Resuelta]
Hola a todosMe estado rompiendo la cabeza buscando una solución al siguiente problema.
Tengo una tabla: serviciosplanrealizados
EXPLAIN serviciosplanrealizados

No se si lograré hacerme entender, lo intentare.
Quiero hacer una sola consulta sobre la misma tabla según ciertos criterios.
Si ejecuto individualmente estos 2 Query muestran la información esperada.
Query A:
Mostrar todos los registros donde el campo o atributo Empresa, tecnico, estado, guardia se cumplan
SELECT * FROM serviciosplanrealizados WHERE empresa = 'LA EMPRESA SA' AND tecnico = 'walter' AND estado = 'T' AND guardia = 'F'
Query B:
Mostrar TODOS los registros donde la palabra impresora se encuentre en el campo o atributo tarea o titulo
SELECT tarea, titulo FROM serviciosplanrealizados WHERE tarea LIKE '%impresora%' OR titulo LIKE '%impresora%'
Hasta ese punto no hay nada extraño.
Ahora aquí es en donde fracaso; quiero hacer una consulta anidada o subconsulta donde se muestren todos los registros del Query A que contenga el Query B.
Dicho de otra manera, mostrar los registros que la palabra "impresora" este presente en el atributo titulo o tarea con las condicionales del Query A.
Si hago esto,
WHERE empresa = 'LA EMPRESA SA' AND tecnico = 'walter' AND estado = 'T' AND guardia = 'F' AND tarea LIKE '%impresora%' OR titulo LIKE '%impresora%'
naturalmente muestran todos los registros cuya palabra "impresora" este contenida en el atributo titulo o tarea y de todas las empresas de todos los técnicos, etc. Es decir toda la tabla completa ya que es afectado por el OR del LIKE '%impresora%' OR titulo LIKE '%impresora% invalidando así las primeras condicionales como empresa, tecnico, etc.
He visto la cláusula IN pero no me ha sido favorable en este caso.
¿Como hago para realizar esa consulta, naturalmente si repetir registros?
Desde ya muchas gracias por la atención.
Que tengan un buen día.
Saludos
Votos: 1 - Respuestas: 4 - Vistas: 20 Compartir en: Google Facebook Twitter LinkedIn Link
Respuestas:
-
Fecha: 05-07-2017 01:43:31 Buenos días Walter, esto lo resuelves con unos paréntesis, veamos como quedaría la query:
SELECT tarea, titulo FROM serviciosplanrealizados WHERE empresa = 'LA EMPRESA SA' AND tecnico = 'walter' AND estado = 'T' AND guardia = 'F' AND (tarea LIKE '%impresora%' OR titulo LIKE '%impresora%');
Otra opción es realizar un subselect, veamos:
SELECT tarea, titulo FROM ( SELECT * FROM serviciosplanrealizados WHERE empresa = 'LA EMPRESA SA' AND tecnico = 'walter' AND estado = 'T' AND guardia = 'F' ) AS tmp WHERE tarea LIKE '%impresora%' OR titulo LIKE '%impresora%';
Nota: la segunda opción es menos óptima.
Espero que mi respuesta te sea de ayuda.
Saludos, Votos: 5 - Link respuesta -
Fecha: 05-07-2017 05:57:45 Fernando:
He probado ambos query, si bien ambos arrojan el mismo resultado y es el esperado, me inclino por utilizar el primer query no solamente por lo que comentas que seria mas optimo, tambien es mas comprensible lo que hace.
Ahora, me asombra que no se me ocurrio el uso de los paréntesis como si fuese una expresión de matemáticas o de lógica. Una solución tan simple que parece brillante.
Se me escapó la tortuga de las manos jejejeje
Desde ya que con tu ayuda se resuelve definitivamente el caso, pero no quiero darlo por cerrado diciendo muchas gracias y resuelto, quiero aportar algo más de valor para futuras referencias que le puedan ser utili a alguien más para el desarrollo de sus conocimientos.

Quiero saber si estoy en lo correcto sobre mi análisis sobre lo que hacen ambos query.
Sobre el primer query
SELECT tarea, titulo FROM serviciosplanrealizados WHERE empresa = 'LA EMPRESA SA' AND tecnico = 'walter' AND estado = 'T' AND guardia = 'F' AND (tarea LIKE '%impresora%' OR titulo LIKE '%impresora%');
Lo que hace es mostrar de la tabla los campos tarea, titulo cuyo criterio se cumplan en el WHERE empresa = 'LA EMPRESA SA' AND tecnico = 'walter' AND estado = 'T' AND guardia = 'F' AND (tarea LIKE '%impresora%' OR titulo LIKE '%impresora%');
Primero resuelve lo que esta entre paréntesis (tarea LIKE '%impresora%' OR titulo LIKE '%impresora%');
Al estar entre paréntesis ( ) es seleccionar si se cumple que la palabra impresora este contenida en el campo tarea o si está contenida en el campo titulo.
Sobre ese conjunto de registros le aplica el filtrado con la condición empresa = 'LA EMPRESA SA' AND tecnico = 'walter' AND estado = 'T' AND guardia = 'F'

El segundo query (subconsulta) es un poco más complejo que el primero en cuanto a su entendimiento.
SELECT tarea, titulo FROM ( SELECT * FROM serviciosplanrealizados WHERE empresa = 'LA EMPRESA SA' AND tecnico = 'walter' AND estado = 'T' AND guardia = 'F' ) AS tmp WHERE tarea LIKE '%impresora%' OR titulo LIKE '%impresora%';
Lo primero que hace es mostrar los campos tarea y titulo de una tabla (temporal, virtual) llamada tmp.
Sería algo así como
SELECT tarea, titulo FROM tmp ...
donde esta tabla (tmp) contiene todos los campos de la tabla cuyos registros coincidan con los criterios del WHERE empresa = 'LA EMPRESA SA' AND tecnico = 'walter' AND estado = 'T' AND guardia = 'F'
Sobre ese conjunto de registros obtenidos en la tabla tmp le aplica un select WHERE tarea LIKE '%impresora%' OR titulo LIKE '%impresora%';
Entendiéndose algo como:
SELECT tarea, titulo FROM tmp WHERE tarea LIKE '%impresora%' OR titulo LIKE '%impresora%';

¿Es correcto el análisis?
Muchisimas gracias por la ayuda Fernando!
Que tengas un buen dia
Saludos Votos: 2 - Link respuesta -
Fecha: 05-07-2017 08:47:11 Hola Walter, me alegra que hayas podido resolver el problema.
Con respecto a tu pregunta, puedes anteponer la sentencia EXPLAIN a las consultas y verás como MySQL resuelve cada una.
Te dejo en enlace a la documentación oficial de MySQL EXPLAIN: https://dev.mysql.com/doc/refman/5.7/en/using-explain.html
Puede que en algunos casos (condiciones del servidor, carga, memoria, estadisticas, indices, otros) la consulta se resuelva de una forma, y en otros se resuelva de otra forma... aquí no es todo blanco ó nego, habrá que verlo con el EXPLAIN.
Saludos, Votos: 3 - Link respuesta -
Fecha: 05-07-2017 09:25:00 Muchas gracias por la info
anteponiendo EXPLAIN al SELECT
Muestra:
Al primer query

Al segundo query

Me da la impresión que el primer query es mejor que el segundo.
Ahora me queda investigar a que se refiere con cada uno de los resultados.
Saludos Votos: 2 - Link respuesta
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
