2009-10-14 10 views
5

tengo una variable $ cadena, y utilizarmysql SELECT COMO debe coincidir sólo palabras completas a la variable

SELECT * FROM db WHERE description LIKE '%$string%' OR headline LIKE '%$string%' 

Como se ve, quiero buscar en los dos campos "Descripción" y "titular" para ver si la variable de cadena coincide con cualquiera de ellos.

¡El problema es que quiero que coincida con palabras completas!

Ejemplo: si la descripción contiene "hola", es suficiente si $ string es una 'h'. esto no es lo que quiero. ¡Tiene que coincidir solo con la palabra completa!

¿He dividido la cadena de consulta en palabras para esto? ¿o que?

Respuesta

9

Si desea la coincidencia de palabras completas, debería considerar intentar la búsqueda FULLTEXT. Un requisito previo es que la mesa debe utilizar el motor MyISAM:

CREATE TABLE test (
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    headline VARCHAR(120) NOT NULL, 
    description VARCHAR(255) NOT NULL, 
    FULLTEXT(headline, description) 
) ENGINE=MyISAM; 

Se podría preguntar para partidos de esta manera:

SELECT * 
FROM test 
WHERE MATCH (headline,description) AGAINST('$string'); 

Esto tiene la ventaja añadida de ordenar los resultados por relevancia.

+0

por eso tampoco hay una característica de este tipo en las bases de datos InnoDB? – Jimmery

+1

@Jimmery habrá búsqueda FULLTEXT en MySQL 5.6 InnoDB cuando se lance. ¡Estén atentos! –

+0

excelente! ¡salud por la información! – Jimmery

13

Una alternativa a la búsqueda de texto completo, que puede ser suficiente, es usar una función REGEXP.

Su consulta de ejemplo podría ser entonces:

SELECT * 
    FROM db 
WHERE description REGEXP '[[:<:]]$string[[:>:]]' = 1 
    OR headline REGEXP '[[:<:]]$string[[:>:]]' = 1 

Ver http://dev.mysql.com/doc/refman/5.1/en/regexp.html

+2

Tenga en cuenta que 'REGEXP' es bastante ineficiente para conjuntos de datos más grandes porque MySQL no puede aprovechar la indexación. –

+0

Para aclarar, no puede aprovechar la indexación para 'LIKE'% term% '', que es lo que el OP ya tenía. Sin embargo, * podría * con 'MATCH() ... AGAINST()' si hay un índice FULLTEXT. – thomasrutter

Cuestiones relacionadas