php - funcion - ¿Cómo usar mysql concat() en la cláusula WHERE?
update concat mysql (7)
Me gustaría buscar en mi tabla una columna de nombres y una columna de apellidos. Actualmente acepto un término de búsqueda de un campo y lo comparo con las dos columnas, una a la vez con
select * from table where first_name like ''%$search_term%'' or
last_name like ''%$search_term%'';
Esto funciona bien con términos de búsqueda de una sola palabra, pero el conjunto de resultados incluye a todos los que tienen el nombre "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?
Hay algunas cosas que podrían interferir: ¿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 al concaturarlos. El uso de trim (first_name) / trim (last_name) lo solucionará, aunque la verdadera solución es actualizar sus datos.
También podrías hacer coincidir dónde dos palabras ocurren pero no necesariamente juntas (suponiendo que estés en php, que la variable $ search_term sugiere que eres)
$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);
Lo que tienes debe funcionar, pero se puede reducir a:
select * from table where concat_ws('' '',first_name,last_name)
like ''%$search_term%'';
¿Puedes proporcionar un nombre de ejemplo y un término de búsqueda donde esto no funciona?
Para Luc:
Estoy de acuerdo con su respuesta, aunque me gustaría añadir que UPPER solo funciona con 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 directamente a la respuesta de Luc, pero por mi vida no pude encontrar la manera de hacerlo. Si un administrador puede mover mi publicación, hágalo.
Puedes intentar esto:
select * FROM table where (concat(first_name, '' '', last_name)) = $search_term;
Tenga en cuenta que la consulta de búsqueda ahora distingue entre mayúsculas y minúsculas.
Cuando usas
SELECT * FROM table WHERE `first_name` LIKE ''%$search_term%''
Coincidirá tanto con "Larry" como con "larry". ¡Con este concat_ws, de repente se volverá sensible a mayúsculas y minúsculas!
Esto se puede solucionar usando la siguiente consulta:
SELECT * FROM table WHERE UPPER(CONCAT_WS('' '', `first_name`, `last_name`) LIKE UPPER(''%$search_term%'')
Editar: Tenga en cuenta que esto solo funciona en elementos no binarios. Ver también la respuesta de mynameispaulie .
puedes hacer eso (trabajar en mysql) probablemente otro SQL también ... solo prueba esto:
select * from table where concat('' '',first_name,last_name)
like ''%$search_term%'';
SELECT *,concat_ws('' '',first_name,last_name) AS whole_name FROM users HAVING whole_name LIKE ''%$search_term%''
... es probablemente lo que quieres.