entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

MYSQL Operador LIKE

SELECT * FROM productos
                    WHERE
                    (
                      clave LIKE '$findProductBy%'
                      OR codigo LIKE '$findProductBy%'
                      OR titulo LIKE '$findProductBy%'
                    ) LIMIT 0,5

El campo título busca por lo que empieza el string que escribe el usuario, pero necesito que también ese mismo campo busque lo que haya escrito el usuario en cualquier parte LIKE '%$findProductBy%' siempre entra al segundo y no al primero. ¿Cómo puedo solucionarlo? Es decir quisiera que el campo titulo busque por titulo LIKE '$findProductBy%' ó titulo LIKE '%$findProductBy%'

2votos

magarzon comentado

No entiendo muy bien tu problema.

Si buscas por SELECT * FROM productos WHERE titulo LIKE '%$findProductBy%' te debería dar tanto los que empiezan por lo que ha escrito el usuario como los que contienen lo que haya escrito el usuario. ¿Qué significa que "siempre entra al segundo y no al primero"? ¿Qué es primero y segundo aquí?

Por otro lado, y ya hablando de temas de optimización y seguridad, las búsquedas por LIKE '%loquesea%' son tremendamente ineficientes, aunque le pongas un limit, no así las LIKE 'loquesea%' o LIKE '%loquesea', que pueden incluso utilizar índices.

Si vas a hacer algo serio, y la tabla puede tener del orden de cientos de miles o millones de registros, utiliza un motor de búsquedas tipo ElasticSearch o SOLR.

Además, dado que $findProductBy parece ser la entrada directa del usuario, no te olvides de utilizar alguna técnica para evitar SQL Injection

2votos

miggbriones comentado

Gracias por el comentario y por el consejo de sanitizar las variables. ElasticSearch, lo tendré en mente ya que he leído muy buenos comentarios. Lo que necesito es, supongamos que el titulo del producto es: ROTOMARTILLO INALAMBRICO , y hay otro que se llama CARBONES DE REPUESTO PARA ROTOMARTILLO ROTO-1/2A3. Siguiendo la lógica del usuario, necesita que le muestre primero los registros que empiecen por ROTOMARTILLO, supongamos que hay unos 100 productos que empiezan con ese titulo. debería mistrar los primeros 5, pero no me los muestra. A eso me refiero con que sólo entra al segundo '%$findProductBy%' y no al primero '$findProductBy%'. Creo que primero haré la consulta, la ejecuto y por medio de mysqli_affected_rows() ya entrar a la siguiente que sería que busque la cadena en cualquier posición del campo guardado. Muchas gracias por tomarte el tiempo en contestar =D.

1voto

magarzon comentado

Bueno, no sé si te has confundido ahora, pero has puesto dos veces %$findProductBy% y %findProductBy%, y en este segundo caso nunca te va a encontrar nada, porque no estás usando la variable.

Supongo que te referías a '$findProductBy%'.

Puedes conseguir lo que quieres con esto:

select * from productos where titulo like '%$findProductBy%' ORDER BY CASE WHEN titulo like '$findProductBy%' then 1 else 2 end, titulo limit 5;

Que te va a dar primero los que empiezan por la cadena buscada, y luego el resto.

1 Respuesta

5votos

magarzon Puntos30650

Pongo mi último comentario como respuesta, porque seguramente es la solución a lo que buscabas:

select * from productos where titulo like '%$findProductBy%' ORDER BY CASE WHEN titulo like '$findProductBy%' then 1 else 2 end, titulo limit 5;

con el order by case se consigue que se pongan primero los que empiezan por la cadena buscada, y luego se añade de nuevo titulo al order by para que ordene alfabéticamente (si no es necesario la ordenación alfabética, y da igual que aparezcan los productos desordenados, siempre que aparezcan primero los que empiezan por la cadena buscada, se puede quitar)

Eso sí, como decía antes, no sé el rendimiento que puede tener esta consulta con una tabla con muchos registros.

2votos

miggbriones comentado

Sí, escribí mal. Error de dedo, deja pruebo y te digo para cerrar ésto. Y muchas gracias nuevamente, te debo una.

3votos

miggbriones comentado

Me quito el sombrero, solucionado. Éra exactamente lo que quería, una disculpa si no supe como exponer mi problema. Muchas gracias.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta