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

[SOLUCIONADO] Misterio Php Between Mysql

Estas en el tema de Misterio Php Between Mysql en el foro de Mysql en Foros del Web. Hola a todos , estoy teniendo un misterio ... la verdad es que puede ser por mi poca experiencia ... os cuento : tengo una ...
  #1 (permalink)  
Antiguo 15/02/2014, 14:10
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Misterio Php Between Mysql

Hola a todos , estoy teniendo un misterio ... la verdad es que puede ser por mi poca experiencia ... os cuento :

tengo una consulta que voy construyendo con una serie de campos y filtros php .

El caso es que según mi lógica de mysql la sentencia esta bien construida :

Código MySQL:
Ver original
  1. SELECT codigo, grupo, familia, marca, precio,
  2. ROUND(precio*40/100+precio,1)AS precio, stock, nombre,
  3. CONCAT( SUBSTRING( caracteristicas, 1, 900 ) , '...' ) AS 'caracter',
  4. IF( imagen = '', 'http://rutano-imagen.jpg', imagen ) AS imagen
  5. FROM Productos
  6. WHERE familia LIKE '%orde' OR familia LIKE '%orde%' OR familia LIKE 'orde'
  7. OR marca LIKE '%orde' OR marca LIKE '%orde%' OR marca LIKE 'orde'
  8. OR nombre LIKE '%orde' OR nombre LIKE '%orde%' OR nombre LIKE 'orde'
  9. AND precio BETWEEN 917 AND 3000 LIMIT 0,10

de hecho cunado la ejecuto en mi ide para mysql MysqlYog funciona perfectamente! pero cuando se ejecuta desde php me funciona todo menos el BETWEEN ... no actúa! alguien sabe a que puede deberse ?

Aqui dejo la consulta con las variables :

Código MySQL:
Ver original
  1. SELECT codigo, grupo, familia, marca, precio, ROUND(precio*40/100+precio,1)AS precio2, stock, nombre, CONCAT( SUBSTRING( caracteristicas, 1, 900 ) ,  '...' ) AS  'caracter', IF( imagen =  '',  'http://www.fincasviladecans.com/img/no-imagen.jpg', imagen ) AS imagen
  2. FROM Productos WHERE Productos.precio $precio and familia  LIKE '%".$busqueda."' OR familia LIKE '%".$busqueda."%'  OR  familia  LIKE '".$busqueda."'
  3. OR marca  LIKE  '%".$busqueda."' OR marca LIKE '%".$busqueda."%'  OR  marca   LIKE '".$busqueda."'
  4. OR nombre   LIKE  '%".$busqueda."' OR nombre LIKE '%".$busqueda."%'  OR nombre  LIKE '".$busqueda."'  LIMIT $inicio,$filasxpagina


Un saludo por adelantado!

Última edición por gnzsoloyo; 15/02/2014 a las 15:20
  #2 (permalink)  
Antiguo 15/02/2014, 15:33
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: Misterio Php Between Mysql

Cita:
pero cuando se ejecuta desde php me funciona todo menos el BETWEEN
Eso, en principio, podría deberse a errores de programación (tema off topic en este foro), por lo que no podemos decirte por qué.
Además, no nos estás diciendo gran cosa cuando expresas "me funciona todo menos...".
¿No te funciona qué? ¿No devuelve datos? ¿Retorna un error de MySQL?
Si no devuelve datos, en el 99%99 de los casos es porque usaste variables que no contienen lo que tu supones que contienen (no exagero, el 99% de los casos que nos pregunta termina siendo eso).
Si no devuelve los datos esperados, entonces los parámetros son incorrectos (puede que las variables tengan la culpa), o bien no hay datos que cumplan lo que pides, cosa que sería un error de datos, y no de SQL.

Ahora bien, analizando la query, lo que yo veo es que tienes demasiadas condiciones LIKE, lo que me lleva a pensar en que es una consulta ineficiente.
No es recomendable hacer una consulta multiple de ese tipo, son propensas a traer mucha basura.
Pero es tu decisión.

Lo que si no me queda claro es qué se supone que queda armado en esta parte:

Código MySQL:
Ver original
  1. ...
  2. WHERE Productos.precio $precio
  3. ...

PD: Te recomiendo escribir las consultas de una forma estructurada, para que sean más fáciles de analizar y ver los erroes:
Código SQL:
Ver original
  1. SELECT
  2.     codigo,
  3.     grupo,
  4.     familia,
  5.     marca,
  6.     precio, ROUND(precio*40/100+precio,1) precio2,
  7.     stock, nombre,
  8.     CONCAT( SUBSTRING( caracteristicas, 1, 900 ) ,  '...' ) caracter,
  9.     IF( imagen =  '',  'http://www.fincasviladecans.com/img/no-imagen.jpg', imagen) imagen
  10. FROM
  11.     Productos
  12. WHERE
  13.     Productos.precio $precio
  14.     AND familia   LIKE '%".$busqueda."'
  15.     OR  familia   LIKE '%".$busqueda."%'  
  16.     OR  familia   LIKE '".$busqueda."'
  17.     OR  marca     LIKE  '%".$busqueda."'
  18.     OR  marca     LIKE '%".$busqueda."%'  
  19.     OR  marca     LIKE '".$busqueda."'
  20.     OR  nombre    LIKE  '%".$busqueda."'
  21.     OR  nombre    LIKE '%".$busqueda."%'  
  22.     OR  nombre    LIKE '".$busqueda."'  
  23. LIMIT $inicio, $filasxpagina
__________________
¿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 15/02/2014, 15:49
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Misterio Php Between Mysql

Gracias gnzsoloyo , me refería a que la consulta se construye bien , es decir.. cuando copio el resultado de la consulta desde php y lo meto en mysql Yog funciona perfecto , es decir me limita los resultados en función de la clausula between ... pero cuando esa misma consulta tal cual , la ejecuto en php ... Sorpresa! me obvia el between!...

La verdad es que estoy aprendiendo y aún estoy muy verde...

Las variables se imprimen bien , pues la consulta con las variables es la que he utilizado con mysql yog y funciona bien! .

Creo que como dices debe ser un tema de valor y no de impresión , podría ser que lo que me llegue por php lo interprete como string... sigo dándole vueltas!

Gracias gnzsoloyo!!
  #4 (permalink)  
Antiguo 15/02/2014, 16:00
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: Misterio Php Between Mysql

Cita:
Iniciado por Djoaq Ver Mensaje
...me obvia el between!...
Pregunta básica: ¿por "obvia", te refieres a que no lo pone en la query que se construye, o que no lo considera en los resultados?

¿Podrías postear una muestra de la tabla de resultados en SQLYog, y otra realizada en el PHP?
Esto es porque no se termina de ver cuál es la diferencia de comportamiento.
Sin verlo, es imposible decirte con certeza qué lo puede causar..

Lo que sí te pudedo decir anticipadamente, es que las condiciones que deben cumplirse, según lo que pusiste, el between sólo aplica a esta condición:

Código MySQL:
Ver original
  1. ...
  2. OR nombre LIKE 'orde'
  3. ...
Todos los otros casos de los LIKEs precedentes pueden no cumplir con el BETWEEN para ser TRUE, a causa del uso de OR (disyunción lógica).
¿Eso lo tuviste en cuenta?
__________________
¿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 15/02/2014, 16:43
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Misterio Php Between Mysql

Como Bien decías gnzsoloyo es un problema de lógica ... mirándolo mas detenidamente me acabo de dar cuenta!

Si es que no se como no he podido ver algo tan obvio !

Voy a hacer una subconsulta ...

Ahora te cuento ...

Última edición por Djoaq; 15/02/2014 a las 17:01 Razón: hacer algunas aclaraciones!
  #6 (permalink)  
Antiguo 15/02/2014, 17:12
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Misterio Php Between Mysql

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Todos los otros casos de los LIKEs precedentes pueden no cumplir con el BETWEEN para ser TRUE, a causa del uso de OR (disyunción lógica).
¿Eso lo tuviste en cuenta?
Que razón tenías ! ya lo tengo solucionado!!

:D

Muchisimas Gracias gnzsoloyo!!
Pongo el codigo , hago un * para no hacerlo mas largo!
Código MySQL:
Ver original
  1. SELECT  codigo,
  2.     grupo,
  3.     familia,
  4.     marca,
  5.     precio,
  6.      ROUND(precio*40/100+precio,1)AS precio2, stock, nombre,
  7.      CONCAT( SUBSTRING( caracteristicas, 1, 900 ) , '...' ) AS 'caracter',
  8.      IF( imagen = '', 'http://www.fincasviladecans.com/img/no-imagen.jpg', imagen ) AS imagen
  9. FROM (SELECT * FROM productos WHERE Productos.precio BETWEEN 100 AND 3000 )t
  10.      WHERE  familia LIKE '%ordenador' OR familia LIKE '%ordenador%'
  11.      OR familia LIKE 'ordenador'
  12.      OR marca LIKE '%ordenador'
  13.      OR marca LIKE '%ordenador%'
  14.      OR marca LIKE 'ordenador'
  15.      OR nombre LIKE '%ordenador'
  16.      OR nombre LIKE '%ordenador%'
  17.      OR nombre LIKE 'ordenador' ORDER BY precio DESC LIMIT 0,10
  #7 (permalink)  
Antiguo 15/02/2014, 17:18
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: Misterio Php Between Mysql

No lo compliques más de lo que necesitas. Con sólo poner la primera parte de condiciones entre paréntesis alcanza:
Código MySQL:
Ver original
  1.     codigo,
  2.     grupo,
  3.     familia,
  4.     marca,
  5.     precio, ROUND(precio*40/100+precio,1) precio2,
  6.     stock, nombre,
  7.     CONCAT( SUBSTRING( caracteristicas, 1, 900 ) ,  '...' ) caracter,
  8.     IF( imagen =  '',  'http://www.fincasviladecans.com/img/no-imagen.jpg', imagen) imagen
  9.     Productos
  10.     precio $precio
  11.     AND
  12.     (familia   LIKE '%".$busqueda."'
  13.     OR  familia   LIKE '%".$busqueda."%'  
  14.     OR  familia   LIKE '".$busqueda."'
  15.     OR  marca     LIKE  '%".$busqueda."'
  16.     OR  marca     LIKE '%".$busqueda."%'  
  17.     OR  marca     LIKE '".$busqueda."'
  18.     OR  nombre    LIKE  '%".$busqueda."'
  19.     OR  nombre    LIKE '%".$busqueda."%'  
  20.     OR  nombre    LIKE '".$busqueda."' )
  21. LIMIT $inicio, $filasxpagina
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 15/02/2014, 19:13
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Misterio Php Between Mysql

Cita:
No lo compliques más de lo que necesitas. Con sólo poner la primera parte de condiciones entre paréntesis alcanza:
Ok ;D

Una pregunta ? , he visto que generalmente la gente utiliza inner , left y right joins ,
yo se usarlos pero no se que diferencia hay entre ellos , sospecho que tendrá que ver con la eficiencia .. la verdad es que yo me he acostumbrado a hacer las querys sin usar joins ...

Que diferencia existe?

Que forma es mas eficiente o mejor para que mysql procese más rápido ?, a parte de tener llaves Primarias....

Un saludo!
  #9 (permalink)  
Antiguo 15/02/2014, 20:00
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: Misterio Php Between Mysql

Cita:
sospecho que tendrá que ver con la eficiencia
No. Tiene que ver con las relaciones establecidas en el ON, y no devuelven los mismos resultados.
INNER JOIN devuelve todo lo que coincide entre la primera y segunda tabla, según se indique en el ON. Es la representación de la junta natural (natural join).
LEFT JOIN devuelve todo lo que exita en la primera tabla (a la izquierda del JOIN), tenga o no relación con la segunda. Los valores no relacionados de la segunda tabla se devuelven como NULL.
RIGHT JOIN es la correspondiente inversa a LEFT JOIN.
Cita:
Que forma es mas eficiente o mejor para que mysql procese más rápido ?, a parte de tener llaves Primarias....
Ese es un terreno largo, vasto y muy, pero muy complejo. No existe un método único, ni reglas absolutas.
Hay multitud de elementos que se deben considerar (indices, relaciones, cardinalidad, tipos de datos, selectividad de condiciones, dispersión de la información, etc., etc.), y lo que resulta perfecto para una consulta, puede resultar catastrófico en otra parecida.
Esto puede darte un acercamiento:

http://dev.mysql.com/doc/refman/5.0/...imization.html
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 16/02/2014, 02:11
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Misterio Php Between Mysql

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No. Tiene que ver con las relaciones establecidas en el ON, y no devuelven los mismos resultados.
INNER JOIN devuelve todo lo que coincide entre la primera y segunda tabla, según se indique en el ON. Es la representación de la junta natural (natural join).
LEFT JOIN devuelve todo lo que exita en la primera tabla (a la izquierda del JOIN), tenga o no relación con la segunda. Los valores no relacionados de la segunda tabla se devuelven como NULL.
RIGHT JOIN es la correspondiente inversa a LEFT JOIN.

Ese es un terreno largo, vasto y muy, pero muy complejo. No existe un método único, ni reglas absolutas.
Hay multitud de elementos que se deben considerar (indices, relaciones, cardinalidad, tipos de datos, selectividad de condiciones, dispersión de la información, etc., etc.), y lo que resulta perfecto para una consulta, puede resultar catastrófico en otra parecida.
Esto puede darte un acercamiento:

[url]http://dev.mysql.com/doc/refman/5.0/en/optimization.html[/url]
Muchas Gracias ! por tu ayuda!

Marco como solucionado!

Etiquetas: php
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 15:00.