2008-11-19 27 views
32

Me gustaría buscar en mi tabla una columna de nombres y una columna de apellidos. Acepto actualmente un término de búsqueda de un campo y compararla con las dos columnas, una a la vez con¿Cómo usar mysql concat() en la cláusula WHERE?

select * from table where first_name like '%$search_term%' or 
    last_name like '%$search_term%'; 

Esto funciona muy bien con los términos de búsqueda de palabras individuales, pero el conjunto de resultados incluye a todos con el nombre de "Larry". Pero si alguien ingresa un nombre, luego un espacio, luego un apellido, quiero un resultado de búsqueda más estrecho. He intentado lo siguiente sin éxito.

select * from table where first_name like '%$search_term%' or last_name 
    like '%$search_term%' or concat_ws(' ',first_name,last_name) 
    like '%$search_term%'; 

¿Algún consejo?

EDITAR: El nombre con el que estoy probando es "Larry Smith". El db almacena "Larry" en la columna "first_name" y "Smith" en la columna "last_name". Los datos están limpios, no hay espacios adicionales y el término de búsqueda se recorta a izquierda y derecha.

EDIT 2: Probé la respuesta de Robert Gamble esta mañana. El suyo es muy similar a lo que estaba corriendo anoche. No puedo explicarlo, pero esta mañana funciona. La única diferencia que puedo pensar es que anoche ejecuté la función concat como el tercer "o" segmento de mi consulta de búsqueda (después de buscar a través de first_name y last_name). Esta mañana lo ejecuté como el último segmento después de leer todo lo anterior, así como direcciones y nombres comerciales.

¿Funcionar con una función mysql al final de una consulta funciona mejor que en el medio?

+0

Me acabo de encontrar la versión que estaba teniendo problemas con y funciona bien para mí. –

Respuesta

66

Lo que has debería funcionar, pero se puede reducir a:

select * from table where concat_ws(' ',first_name,last_name) 
like '%$search_term%'; 

¿Puede dar un nombre de ejemplo y término de búsqueda, donde esto no funciona?

+0

Acepto, ejecuté esto y se comporta como era de esperar ... –

+0

¿Esta sintaxis o algo similar es compatible con todas las bases de datos? ¿Se menciona en el estándar SQL? –

+0

¿Hay alguna forma de hacerlo, aunque diferente en todas las bases de datos? –

2
SELECT *,concat_ws(' ',first_name,last_name) AS whole_name FROM users HAVING whole_name LIKE '%$search_term%' 

... es probablemente lo que quieres.

1

Hay algunas cosas que podrían interponerse en su camino: ¿sus datos están limpios?

Podría ser que tenga espacios al final del campo del primer nombre, lo que significa que tiene dos espacios entre el nombre y el apellido cuando los concat? El uso de trim (first_name)/trim (last_name) lo solucionará, aunque la verdadera solución es actualizar sus datos.

Se podría también esta para que coincida con el que tanto se producen dos palabras pero no necesariamente juntos (suponiendo que está en php - la que la variable $ search_term sugiere usted es)

$whereclauses=array(); 
$terms = explode(' ', $search_term); 
foreach ($terms as $term) { 
    $term = mysql_real_escape_string($term); 
    $whereclauses[] = "CONCAT(first_name, ' ', last_name) LIKE '%$term%'"; 
} 
$sql = "select * from table where"; 
$sql .= implode(' and ', $whereclauses); 
9

Tenga en cuenta que la consulta de búsqueda es ahora el caso sensible.

Al utilizar

SELECT * FROM table WHERE `first_name` LIKE '%$search_term%' 

que coincidirá tanto "Larry" y "Larry". ¡Con este concat_ws, de repente se volverá sensible a mayúsculas y minúsculas!

Esto se puede solucionar utilizando la siguiente consulta:

SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', `first_name`, `last_name`) LIKE UPPER('%$search_term%') 

Editar: Tenga en cuenta que esto sólo funciona en elementos no binarios. Consulte también mynameispaulie's answer.

+0

Consulte también [esta respuesta] (http://stackoverflow.com/a/13184217/13531) –

+2

En caso de que esté concatenando campos enteros, la distinción entre mayúsculas y minúsculas también puede ser el resultado de un error en MySQL anterior a la versión 5.5. Consulte esto [ respuesta] (http://stackoverflow.com/questions/6397156/why-concat-does-not-default-to-default-charset-in-mysql) – TheStoryCoder

1

se puede hacer eso (trabajo en MySQL) probablemente otra SQL también .. Intenta esto:

select * from table where concat(' ',first_name,last_name) 
    like '%$search_term%'; 
+0

probé whis uno y funcionó muy bien. gracias –

4

Para Luc:

Estoy de acuerdo con su respuesta, aunque me gustaría añadir ese UPPER solo funciona en elementos no binarios. Si está trabajando con, por ejemplo, una columna AGE (o algo numérico), deberá realizar una conversión CAST para que la función UPPER funcione correctamente.

SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', first_name, last_name, CAST(age AS CHAR)) LIKE UPPER('%$search_term%'); 

Perdóname por no responder a la respuesta de Luc directamente, sino para la vida de mí no podía encontrar la manera de hacer eso. Si un administrador puede mover mi publicación, hágalo.

+0

¡Bienvenido a Stack Overflow! Dejar comentarios requiere [50 reputación] (http://stackoverflow.com/privileges/comment). Sí, es molesto para los visitantes agregar algo útil, pero también reduce la charla irrelevante. En cualquier caso, es desacertado publicar lo que debería ser un comentario como respuesta, pero dado que proporcionó información relevante para resolver el problema, probablemente esté bien. –

+0

Cincuenta es un límite bastante alto:/De todos modos, elevé tu respuesta (+10 rep) y se vinculó a ella en mi publicación. Gracias por la adición :) – Luc

+0

En caso de que esté concatenando campos enteros, la distinción entre mayúsculas y minúsculas también puede ser el resultado de un error en MySQL antes de la versión 5.5. Consulte esta [respuesta] (http://stackoverflow.com/questions/6397156/why -concat-does-not-default-to-default-charset-in-mysql) – TheStoryCoder

-1

Puede probar esto:

select * FROM table where (concat(first_name, ' ', last_name)) = $search_term; 
+1

Tendrá que agregar corchetes a su '$ search_term' – Naruto

+0

Esto también requiere que el usuario ingrese el nombre exactamente en lugar de coincidencias parciales (ejemplo : 'Pat' coincide con 'Pat' y 'Patrick') –

Cuestiones relacionadas