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

Problemas con consulta SQL

Estas en el tema de Problemas con consulta SQL en el foro de Mysql en Foros del Web. Buenas tardes tengo la siguiente Consulta: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original SELECT * FROM solicitudes WHERE estatus LIKE '%$buscarEsta%' AND dInstruccional LIKE '%$buscarDin%' AND ...
  #1 (permalink)  
Antiguo 19/06/2013, 12:08
 
Fecha de Ingreso: septiembre-2007
Mensajes: 40
Antigüedad: 16 años, 7 meses
Puntos: 0
Problemas con consulta SQL

Buenas tardes tengo la siguiente Consulta:

Código SQL:
Ver original
  1. SELECT * FROM solicitudes
  2. WHERE estatus LIKE '%$buscarEsta%'
  3. AND dInstruccional LIKE '%$buscarDin%'
  4. AND dGrafico LIKE '%buscarGra%'
  5. AND estudio LIKE '%$buscarEstu%'
  6. AND empresa LIKE '%$buscarEmpre%' ORDER BY id DESC

La misma me da este erro:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''%buscarGra%' AND estudio like '%%' AND empresa like '%%'' at line 1

Agradeceria su ayuda.

Saludos

Última edición por gnzsoloyo; 19/06/2013 a las 12:32
  #2 (permalink)  
Antiguo 19/06/2013, 12:22
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Problemas con consulta SQL

Hola eprado:

La consulta, como tal, no tiene absolutamente nada de malo, sin embargo, estás mezclando código SQL con PHP, lo cual está absolutamente prohibido en este foro...

¿Qué valores tienen tus variables/parámetros ($buscarEsta, $buscarDin, etc)? es decir, ¿qué es exactamente lo que estás tratando de ejecutar? En este foro en realidad no nos interesa el lenguaje de programación que estás utilizando, por lo que debes evitar en el futuro hacer estas mezclas...

Postea la consulta que estás tratando de ejecutar, tal cual, sin parámetros... ahí es donde debe estar el error...

Código:
SELECT * FROM solicitudes 
WHERE 
estatus LIKE '%$buscarEsta%' AND 
dInstruccional LIKE '%$buscarDin%' AND 
dGrafico LIKE '%buscarGra%' AND 
estudio LIKE '%$buscarEstu%' AND 
empresa LIKE '%$buscarEmpre%' 
ORDER BY id DESC
Finalmente dos observaciones, primero, en una de las condiciones no estás colocando el $, no sé nada de PHP, pero imagino que este sirve para diferenciar los nombres de las variables... y dos, por qué diablos debes hacer una comparación tipo

Código:
campo LIKE '%%'
Esto no tiene sentido, pues el resultado es el mismo a que si no pusieras ninguna condición... además, las comparaciones LIKE tienen un pésimo rendimiento y debes evitarlas en la medida de lo posible.

Saludos
Leo.
  #3 (permalink)  
Antiguo 19/06/2013, 12:28
 
Fecha de Ingreso: septiembre-2007
Mensajes: 40
Antigüedad: 16 años, 7 meses
Puntos: 0
Respuesta: Problemas con consulta SQL

El valor de las variables pertenecen al post de un formulario.
  #4 (permalink)  
Antiguo 19/06/2013, 12:38
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, 4 meses
Puntos: 2658
Respuesta: Problemas con consulta SQL

Pero si no las verificas, puede entrar un apóstrofo (') y romperte toda la sintaxis...
Es lo mínimo que se debe hacer.
__________________
¿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 19/06/2013, 20:59
 
Fecha de Ingreso: abril-2011
Mensajes: 66
Antigüedad: 13 años
Puntos: 7
Respuesta: Problemas con consulta SQL

Cita:
.. en una de las condiciones no estás colocando el $, no sé nada de PHP, pero imagino que este sirve para diferenciar los nombres de las variables..
@leonardo_josue: tienes toda la razon, eso lo que hace es declarar una variable.

Cita:
Esto no tiene sentido, pues el resultado es el mismo a que si no pusieras ninguna condición... además, las comparaciones LIKE tienen un pésimo rendimiento y debes evitarlas en la medida de lo posible.
@leonardo_josue: El que haya utilizado esa sintaxis en su consulta, es correcto. Te explico. Los simbolos %% que esten contenidas en una palabra, hara que mysql compare buscando en el campo especificado, si esa palabra se encuentra contenida en alguna parte del campo, es decir, si por ejemplo tu especificas el campo empresa, y por ejemplo deseas buscar todas las empresas que comiencen con "poer" (por darte un ejemplo), mysql buscarac en el campo empresa todas las filas que contengan la palabra poer. Asi, los valores validos entregados por la consulta pueden ser:

- poertuni
- kupoer
- aspoertuber

Si te fijas, cada una de las opciones entregadas contiene en si la palabra poer dentro de la conntruccion del nombre completo. Por ultimo, esos simbolos en las consultas de MySQL, se llaman comodines.

Cita:
Pero si no las verificas, puede entrar un apóstrofo (') y romperte toda la sintaxis...
Es lo mínimo que se debe hacer.
@gnzsoloyo: Aunque lo haga, igual va a estar escribiendo mal la consulta o la consulta se va a romper, si no escribe de manera correcta la linea de codigo.

Cita:
lo cual está absolutamente prohibido en este foro...
@eprado: Es sabido por nosotros, y deberias repasar las normas del foro. Si lo deseas me puedes contactar por mp, y te digo como deberia quedar. No vuelvo a cometer el mismo error.

Saludos.

Última edición por max_mouse699; 19/06/2013 a las 21:01 Razón: me equivoque en nombre de usuario.
  #6 (permalink)  
Antiguo 20/06/2013, 06:20
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, 4 meses
Puntos: 2658
Respuesta: Problemas con consulta SQL

Cita:
Aunque lo haga, igual va a estar escribiendo mal la consulta o la consulta se va a romper, si no escribe de manera correcta la linea de codigo.
@max_mouse699: Esta consulta que usa no tiene errores de sintaxis.
Código MySQL:
Ver original
  1.     *
  2.     `solicitudes`
  3.     `estatus` LIKE '%$buscarEsta%'
  4.     AND `dInstruccional` LIKE '%$buscarDin%'
  5.     AND `dGrafico` LIKE '%buscarGra%'
  6.     AND `estudio` LIKE '%$buscarEstu%'
  7.     AND `empresa` LIKE '%$buscarEmpre%'
Si se producen errores no se debe a eso sino al contenido de las variables, que puede estar vacías o contener caracteres que la rompan.
Personalmente no soy partidario de abusar del LIKE de esta forma, y menos aún de tantas condiciones mandatorias, pero la sintaxis no es el problema. Son los parámetros.
__________________
¿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 21/06/2013, 08:03
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Problemas con consulta SQL

Hola de nuevo:

Cita:
@leonardo_josue: El que haya utilizado esa sintaxis en su consulta, es correcto. Te explico. Los simbolos %% que esten contenidas en una palabra, hara que mysql compare buscando en el campo especificado, si esa palabra se encuentra contenida en alguna parte del campo, es decir, si por ejemplo tu especificas el campo empresa, y por ejemplo deseas buscar todas las empresas que comiencen con "poer" (por darte un ejemplo), mysql buscarac en el campo empresa todas las filas que contengan la palabra poer. Asi, los valores validos entregados por la consulta pueden ser:

- poertuni
- kupoer
- aspoertuber

Si te fijas, cada una de las opciones entregadas contiene en si la palabra poer dentro de la conntruccion del nombre completo. Por ultimo, esos simbolos en las consultas de MySQL, se llaman comodines.
@max_mouse699: Gracias por la lección sobre el uso del LIKE ... sé perfectamente como funciona y para qué sirven los comodines, lo que quiero hacerle notar a eprado es que hacer una consulta donde el resultado de la concatenación sea una cadena que quede así:

Código:
...
campo LIKE '%%'
...
es decir, sin que la cadena contenga otra cosas mas que los dos símbolos de porcentaje ES COMPLETAMENTE INUTIL. Este caso puede ocurrir si por ejemplo las variables/parámetros vienen como NULL, la concatenación quedará exactamente como la puse arriba, sin embargo, y lo hago notar en mi post. Esta tipo de consultas es TERRIBLEMENTE INEFICIENTE, en todo caso es mejor omitir dicha condición de la consulta... a final de cuentas, el resultado de poner una condición como la pongo arriba o no poner ninguna condición ES EXACTAMENTE LO MISMO. Sin embargo, al poner la condición estás obligando al DBSM a buscar de manera exhaustiva algo que por defecto es verdadero.

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla WHERE campo LIKE '%%';
  2. +------+-------------+
  3. | id   | campo       |
  4. +------+-------------+
  5. |    1 | poertuni    |
  6. |    2 | kupoer      |
  7. |    3 | aspoertuber |
  8. |    4 | otro valor  |
  9. +------+-------------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM tabla;
  13. +------+-------------+
  14. | id   | campo       |
  15. +------+-------------+
  16. |    1 | poertuni    |
  17. |    2 | kupoer      |
  18. |    3 | aspoertuber |
  19. |    4 | otro valor  |
  20. +------+-------------+
  21. 4 rows in set (0.00 sec)

Si estás seguro que las variables/parámetros SIEMPRE VAN A CONTENER UN VALOR entonces puedes ignorar mi comentario, pero si por lo contrario, ES POSIBLE QUE TUS VALORES VENGAN COMO NULL es mejor que hagas una verificación previa, algo así:

Código:
consulta = 'SELECT campos FROM TABLA WHERE 1=1 '
SI $buscarEsta ES DIFERENTE DE NULL
    consulta = consulta + 'AND campo LIKE '%$buscarEsta%'
es decir, SÓLO AGREGAR LA CONDICIÓN CUANDO REALMENTE SE NECESITE.

Además, en la medida de lo posible hay que evitar las consultas donde utilizas comodines en ambos lados de la palabra a buscar, como es el caso. INSISTO, ESTO ES TERRIBLEMENTE INEFICIENTE.

Es preferible utilizar la función INSTR()... el resultado también sería el mismo, pero tiene un mejor rendimiento. Utilizando el mismo ejemplo que colocas en tu post te muestro a qué me refiero:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla WHERE campo LIKE '%poer%';
  2. +------+-------------+
  3. | id   | campo       |
  4. +------+-------------+
  5. |    1 | poertuni    |
  6. |    2 | kupoer      |
  7. |    3 | aspoertuber |
  8. +------+-------------+
  9. 3 rows in set (0.01 sec)
  10.  
  11. mysql> SELECT * FROM tabla WHERE INSTR(campo, 'poer') > 0;
  12. +------+-------------+
  13. | id   | campo       |
  14. +------+-------------+
  15. |    1 | poertuni    |
  16. |    2 | kupoer      |
  17. |    3 | aspoertuber |
  18. +------+-------------+
  19. 3 rows in set (0.00 sec)

Con pocos registros, la diferencia en los tiempos de respuesta puede no ser significativa (apenas 1 centécima de segundo en este caso) pero cuando tienes muchos registros en tus tablas la diferencia en rendimiento es considerable.

gnzsoloyo hace un perfecto resumen de todo lo que planteamos en nuestros posts:

Cita:
Si se producen errores no se debe a eso sino al contenido de las variables, que puede estar vacías o contener caracteres que la rompan.

Personalmente no soy partidario de abusar del LIKE de esta forma, y menos aún de tantas condiciones mandatorias, pero la sintaxis no es el problema. Son los parámetros.
Saludos
Leo.

Última edición por leonardo_josue; 21/06/2013 a las 10:19
  #8 (permalink)  
Antiguo 24/06/2013, 14:12
 
Fecha de Ingreso: abril-2011
Mensajes: 66
Antigüedad: 13 años
Puntos: 7
Respuesta: Problemas con consulta SQL

Cita:
@max_mouse699: Esta consulta que usa no tiene errores de sintaxis.
@gnzsoloyo: entiendo tu punto, pero lo que mencione, lo mencione para que el usuario programe de mejor manera, asi sera mas facil y rapido para el usuario detectar algun error en la construccion de la consulta. Ahora, lo que mencione, tambien lo hice porque me gusta respetar el como se debe escribir un codigo, aunque tengo claro que en php hay mucha libertad en cuanto a la escritura de su cpdigo, y que se pueden escribir directamente sus variables en la construccion de una query. Mas abajo explicare de mejor manera el porque lo mencione.

Cita:
@max_mouse699: Gracias por la lección sobre el uso del LIKE ... sé perfectamente como funciona y para qué sirven los comodines, lo que quiero hacerle notar a eprado es que hacer una consulta donde el resultado de la concatenación sea una cadena que quede así:
Primero: entiendo tu ironia, y si te molesto, te pido disculpas. Pero en muchas oprtunidades me he encontrado con personas que cuando uno le habla de una manera asumiendo que entienden, despues de largos post, te das cuenta de que la base de ese concepto nos les queda del todo claro, como me paso a mi con una confusion que tuve con los joins, y que recuerdo muy bien que gnzsoloyo ,e lo aclaro. Persona si te molesto.

Cita:
es decir, sin que la cadena contenga otra cosas mas que los dos símbolos de porcentaje ES COMPLETAMENTE INUTIL. Este caso puede ocurrir si por ejemplo las variables/parámetros vienen como NULL, la concatenación quedará exactamente como la puse arriba, sin embargo, y lo hago notar en mi post. Esta tipo de consultas es TERRIBLEMENTE INEFICIENTE, en todo caso es mejor omitir dicha condición de la consulta... a final de cuentas, el resultado de poner una condición como la pongo arriba o no poner ninguna condición ES EXACTAMENTE LO MISMO. Sin embargo, al poner la condición estás obligando al DBSM a buscar de manera exhaustiva algo que por defecto es verdadero.
Segundo: asi mismo como pusiste el ejemplo, es lo que quiero evitar, que si el usuario no pone ninguna variable, o si la variable es NULL, que mejor esa parte de la instrccion desaparezca, en ves de que aparezca y que tal cual como tu indicas, se convierta en una consulta ineficiente.

Cita:
Si estás seguro que las variables/parámetros SIEMPRE VAN A CONTENER UN VALOR entonces puedes ignorar mi comentario, pero si por lo contrario, ES POSIBLE QUE TUS VALORES VENGAN COMO NULL es mejor que hagas una verificación previa, algo así

es decir, SÓLO AGREGAR LA CONDICIÓN CUANDO REALMENTE SE NECESITE.:
Tercero: Es precisamente lo que queria decir, asi tal cual como tu pones el ejemplo, eso es lo que queria mencionar.

Cita:
Con pocos registros, la diferencia en los tiempos de respuesta puede no ser significativa (apenas 1 centécima de segundo en este caso) pero cuando tienes muchos registros en tus tablas la diferencia en rendimiento es considerable.
Cuarto: Gracias por el consejo, de verdad que no lo sabia, he aprendido algo nuevo gracias a ti.



Lo que queria mencionar con respecto a la escritura de la consulta, y a la correcta escritura, es que si el usuario escribe como ustedes lo indican, tendria que controlar el uso de las comillas, y tendria que controlar si los caracteres escritos en la consulta son los correctos o no.


En cambio, si lo escribe como en su oprtunidad lo propuso leonardo_josue, que concatenara la construccion de la consulta:

Código:
query_a = "SELECT * FROM" . tabla . "WHERE campo LIKE '%" . valor . "%'";

o de lo contrario

query = "WHERE campo LIKE '%" . valor . "%'";
query_b = "SELECT * FROM" . tabla . " " . query;
no se tendria que preocupar ni de las comillas, ni de los caracteres, debido a que todo lo tomaria como string, de lo unico que se tendria que preocupar es de que la variable no contenga una comilla simple, que eso romperia la consulta, y llevaria a error, el resto es preocuparse de que los valores lleguen mediante las variables. Incluso, si lo pueden apreciar, lo puede hacer de la otra forma, y la consulta estaria en una buena construccion.

Eso es lo que propuso leonardo_josue, el cual le encontre toda la razon. Ahora si lo deja como ustedes lo indican, seria un problema a la hora de detectar un error posible en la consulta, debido a que no quedaria a la vista y bastante claro para el programador, que el error es problema de la consulta, debido a que seria mas notorio darse cuenta que en una consulta me falta un LIKE, a que empezar a revisar la consulta, y descubrir que en realidad el LIKE esta bien, pero no le paso ningun valor.

Espero haberme explicado bien.
Saludos.

Última edición por max_mouse699; 24/06/2013 a las 14:17 Razón: faltaron valores

Etiquetas: select, sql
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 09:59.