¿Cómo puedo realizar una simple declaración SQL de búsqueda a través de las tablas?

StackOverflow https://stackoverflow.com/questions/56334

  •  09-06-2019
  •  | 
  •  

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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top