2011-08-11 37 views
14

Tengo una tabla de clientes con dos columnas first_name y last_name.¿Cómo hacer un LIKE considerando dos columnas?

¿Cómo puedo usar LIKE en una consulta para poder obtener datos de ambas columnas al mismo tiempo?

Por ejemplo:

SELECT CONCAT(first_name, ' ', last_name) as 'full_name' 
FROM customer WHERE full_name LIKE 'John D%' 

He intentado esto y me dice full_name columna no existe.

+0

[Búsqueda de texto completo] (http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html) es el más medios eficientes en SQL para hacer lo que quieras. –

+0

@OMG Como pude cambiar la tabla y la inserción de datos, creé una nueva columna indexada full_name y la usé en su lugar debido a problemas de rendimiento mencionados en las respuestas. – RedDragon

Respuesta

31
SELECT CONCAT(first_name, ' ', last_name) as 'full_name' 
FROM customer WHERE CONCAT(first_name, ' ', last_name) LIKE 'John D%' 
+1

Es posible que también desee recortar el primer nombre y el último nombre para contabilizar posibles espacios adicionales en las columnas. – Narnian

+1

También puede verificar una variante "apellido, nombre" si el usuario también puede ingresar eso. – Narnian

+0

Tan simple, brillante. danke :) – arjunaaji

5

Usted está casi allí

SELECT * 
FROM customer 
WHERE CONCAT(first_name, ' ', last_name) LIKE 'John D%' 

Nota: esto puede no tener un rendimiento muy bueno. Es posible que desee considerar full text search.

0

No tengo MySql a la mano, pero ¿no puede hacer algo como el siguiente código?

SELECT CONCAT(first_name, ' ', last_name) as 'full_name' 
FROM customer WHERE CONCAT(first_name, ' ', last_name) LIKE 'John D%' 

Descargo de responsabilidad: THIS COULD BE very SLOW !!!

4

Uso HAVING en lugar de WHERE:

SELECT CONCAT(first_name, ' ', last_name) as 'full_name' 
    FROM customer HAVING full_name LIKE 'John D%' 
+1

¿Por qué TENER en lugar de DÓNDE? –

0
SELECT * 
FROM customer 
WHERE CONCAT(first_name, ' ', last_name) LIKE 'John D%' 

podría ser muy lento, pero eso no importará si su base de datos es bastante pequeña. Cuando use CONCAT, asegúrese de que la clasificación sea la misma para los nombres de las columnas o de lo contrario, obtendrá un error.

A continuación se muestra una declaración para cuando quiero que mi sentencia LIKE funcione tanto para el nombre de la categoría como para el nombre del curso. Compruebo cat_id en ambas tablas para poder tener una idea de qué curso pertenece a cada categoría.

SELECT * FROM courses a INNER JOIN categories b ON a.cat_id=b.cat_id 
WHERE CONCAT(b.cat_name,' ',a.course_name) 
LIKE :name ORDER BY b.cat_id 

: nombre es marcador de posición (DOP)

Cuestiones relacionadas