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

1voto

Realizar búsqueda con LIKE uniendo campos

Necesito realizar búsquedas de un usuario por nombre completo

En la base de datos tengo dos campos (name y surname), y cuando queremos buscar a un usuario, tenemos dos input que mediante ajax realizan una busqueda (con lo cual se envian 2 parámetros al controlador)

He intentado realizar la búsqueda con esta sentencia de ejemplo, pero no me devuelve ningún resultado:

SELECT * FROM `user` WHERE `name`+' '+`surname` LIKE '%linus%torvalds%'

Nota: Tengo varios linus torlvalds en la base de datos, con apellidos diferentes y en distintos lugares

Nota2: Debe de ser en una sola búsqueda (separando los campos funciona, pero necesito que sea así)

3 Respuestas

3votos

Leonardo-Tadei Puntos216110

Hola @rubengc,

una de las querys corerctas para hacer esta búsqueda es:

SELECT * FROM `user` WHERE `name` LIKE '%linus% ' AND `surname` LIKE '%torvalds%'

No es posible plantearla concatenando campos (el operador + no es el corercto, sería CONCAT() ) porque no es aplicable al WHERE ni es aplicable a nombres de columnas (al menos en los RDMBS que conozco).

El trabajo extra que tendrás que hacer es parsear la entrada separando por los espacios para determinar qué va en 'name' y que va en el 'surname'. Si en vez de usar el operador AND usás OR, podrías poner todas las palabras tanto en el nombre como en el apellido y obtendrías resultados:

SELECT * FROM `user` WHERE `name` LIKE '%linus% ' OR `name` LIKE '%torvalds%' OR `surname` LIKE '%linus%' OR `surname` LIKE '%torvalds%'

Saludos!

Bclatino comentado hace 5 días

Hola @Leonardo-Tadei.
Tengo actualmente el siguiente problema, un formulario con varios controles dentro de este se encuentra el siguiente JtexField, con nombre txfSerchReleased.
Lo que necesito es que al escribir, el idproducto y nom_producto en tiempo real, se realice la busqueda en la base de datos y actualice la tabla.
Esto se realiza pero unicamente buscando el nombre y no el idproducto.
private void txfSearchKeyReleased(java.awt.event.KeyEvent evt) {
String sql = "SELECT * FROM producto WHERE nom_producto LIKE ?";

    try{
       pst = conn.prepareStatement(sql);
       pst.setString(1, txfSearch.getText()+"%");
       rst = pst.executeQuery();
       tablaproductos.setModel(DbUtils.resultSetToTableModel(rst));

    }
    catch(Exception e){
      JOptionPane.showMessageDialog(null, e);
    }
} 

Leonardo-Tadei comentado hace 5 días

Hola @Bclatino,

creá por favor una nueva pregunta para esto, que no tiene nada que ver con la pregunta original.

Saludos cordiales!

2votos

mrczrt Puntos6880

Hola que tal, claro que puedes concatenar en mysql para tu búsqueda puedes usar : SELECT * FROMuserWHERE CONCAT_WS(' ',name,surname) LIKE '%linus torvalds%'.

Si necesitas algo mas especifico por favor dame detalles, saludos.

Leonardo-Tadei comentado Dic 20, 2013

Hola Marcos,

en ANSI SQL no es válido tener un CONCAT() en un WHERE. dependerá de la implementación del Servidor de Bases de Datos si funcionan estas cosas o no... por ejemplo, MySQL creo que a partir de la versión 5 lo soporta (de ahí es otra historia hacer que la query dependa de una versión de un RDMBS pudiéndola escribir de forma standard)

Saludos!

mrczrt comentado Dic 20, 2013

Tiene usted razón Leonardo, pero en este caso la pregunta tiene la etiqueta MySQL y para este si aplica el CONCAT_WS en el WHERE, saluuudos hasta.... Argentina? España? :)

mrczrt comentado Dic 20, 2013

Déjeme algo Leonardo :D debes en cuando una "Mejor Respuesta" no me va a hacer daño.

Leonardo-Tadei comentado Dic 20, 2013

Hola Marcos,

lo que son las cosas: en la pregunta está la etiqueta, pero en esta pantalla no se ven los tags... ya mismo se lo reporto a @Peter

Estoy en Argentina... y soy fácil de googlear ;-)

Me estoy enterando que esto era una carrera por tener la "mejor respuesta"... y yo que pensaba que era para dar una mano a los colegas y que esto servía para que todos aprendamos. En fin: te cedería gustoso unas "mejor respuesta" si hubiera cómo y si valiera la pena. O mejor, te vendo por eBay algunos puntos! Jajajaja!!!

Saludos desde el Sur!

Peter comentado Dic 20, 2013

Por favor publicalo en la sección de errores y le damos solución. Que raro que no veas las etiquetas!!

Saludos.

mrczrt comentado Dic 20, 2013

Jaja, como lo dices solo es aportar por eso soy muy breve en mis respuestas, pensaba que competías por que tus respuestas son muy extensas incluso le haces el "trabajo" a los demas en algunos casos, eso sin mencionar que casi siempre llegas primero a contestar como a esta pregunta por ejemplo... en fin solo son patrones que note, pero ya me haces ver que estoy equivocado, un gusto conocer gente como usted y como Peter con una buena intención por compartir.

Saluudos.

1voto

Puedes hacer uso de las búsquedas booleanas full-text de SQL:

Guía de desarrollo de SQL - Boolean full-text searches

Es decir, podrías hacer algo como:

SELECT * FROM user WHERE MATCH (name,surname) -> AGAINST ('+linus+torvalds' IN BOOLEAN MODE);

Saludos.

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

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

...

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

Conecta