¿Cómo puedo realizar una simple declaración SQL de búsqueda a través de las tablas?
Pregunta
Supongamos que las dos tablas que existen: users
y groups
.
¿Cómo hace uno para proporcionar la "búsqueda simple" en el que un usuario introduce texto y los resultados contienen tanto los usuarios y grupos cuyos nombres contienen el texto?
El resultado de la búsqueda debe distinguir entre los dos tipos.
Solución
El truco es combinar un UNION
con un literal de cadena para determinar el tipo de 'objeto' devolvió.En la mayoría de los (?) de los casos, la UNIÓN de TODOS será más eficiente, y debe ser utilizado a menos que los duplicados son necesarios en la sub-consultas.El siguiente patrón debería ser suficiente:
SELECT "group" type, name
FROM groups
WHERE name LIKE "%$text%"
UNION ALL
SELECT "user" type, name
FROM users
WHERE name LIKE "%$text%"
NOTA:He añadido la respuesta a mí mismo, porque me encontré con este problema de ayer, no podía encontrar una buena solución, y se utiliza este método.Si alguien tiene un mejor enfoque, por favor, siéntase libre de añadir.
Otros consejos
Si utiliza "la UNIÓN de TODOS", a continuación, el db no trate de eliminar los duplicados - usted no tiene duplicados entre las dos consultas de todos modos (ya que la primera columna es diferente), por lo que la UNIÓN de TODOS será más rápido.
(Asumo que usted no tiene duplicados dentro de cada consulta que desea quitar)
Utilizando COMO va a causar una serie de problemas, ya que se requiere un examen de la tabla cada vez cuando COMO comparador comienza con un %.Esto obliga a SQL para comprobar cada fila y trabajar su camino, byte por byte, a través de la cadena está utilizando para la comparación.Mientras que esto puede estar bien al inicio, rápidamente causas cuestiones de escala.
Una mejor manera de manejar esto es mediante la Búsqueda de Texto Completo.Si bien esta sería una más complejo opción, se le proporcionará mejores resultados para bases de datos muy grandes.A continuación, puede utilizar un funcionamiento de la versión del ejemplo Bobby Jack le dio a UNION ALL
los dos conjuntos de resultados y mostrar los resultados.
Yo sugeriría otra adición
SELECT "group" type, name
FROM groups
WHERE UPPER(name) LIKE UPPER("%$text%")
UNION ALL
SELECT "user" type, name
FROM users
WHERE UPPER(name) LIKE UPPER("%$text%")
Usted podría convertir a $texto a mayúsculas la primera o hacer hazlo en la consulta.De esta manera se consigue un insensible a mayúsculas-minúsculas de búsqueda.