2009-01-24 21 views
6

Actualmente He siguientes dos tablas:búsqueda dos mesas

CREATE TABLE files_list 
(
    'listid' INT, 
    'name' VARCHAR(25), 
    'synonym' VARCHAR(25), 
    'description' VARCHAR(25) 
); 

CREATE TABLE files_tags 
(
    'tag_name' VARCHAR(25), 
    'listid' INT 
); 

Si alguien utiliza la palabra clave "Dragon Ball", en este momento, yo uso siguientes consulta para buscar my_list de posibles coincidencias:

SELECT * 
FROM files_list 
WHERE name LIKE '%dragon%' 
OR synonym LIKE '%dragon%' 
OR description LIKE '%dragon%' 
OR name LIKE '%ball%' 
OR synonym LIKE '%ball%' 
OR description LIKE '%ball%' 

No estoy seguro de cómo buscar ambas tablas con una consulta. Quiero mostrar al usuario los datos siguientes en el resultado de búsqueda: nombre, sinónimo, descripción y todas las etiquetas.

Mis preguntas 1. ¿Hay alguna forma de hacer que la consulta mysql actual sea más corta? 2. ¿Cómo puedo combinarlo con la tabla files_tags, - para mostrar filas desde files_list que tiene una coincidencia en files_tags, pero no en files_list? - para mostrar filas desde files_list que tiene una coincidencia en files_list, but may not in files_tags`?

Se puede ver el resultado actual que se muestra en http://hsbsitez.com/

+0

http://stackoverflow.com/questions/394041/mysql-how-to-search-multiple-tables-for-a-string-existing-in-any-column Consulte esta pregunta su respuesta está allí :) – fmsf

+0

Posible duplicado de [MySQL: cómo buscar múltiples tablas para una cadena existente en cualquier columna] (http://stackoverflow.com/questions/394041/mysql-how-to-search-multiple-tables-for-a-string-existing-in-any-column) – KindaTechy

Respuesta

0

Tenga cuidado al usar la unión para conseguir realmente las columnas que desee para cada consulta resultante de la unión. Y este caso, una sub consulta parece tener más sentido:

SELECT name, synonym, description FROM files_list WHERE 
     name LIKE '%dragon%' OR synonym LIKE '%dragon%' OR description LIKE '%dragon%' 
     OR name LIKE '%ball%' OR synonym LIKE '%ball%' OR description LIKE '%ball%' 
     OR listid IN (SELECT listid FROM files_tags WHERE tag_name='dragon' OR tag_name='ball'); 

Algunas preguntas adicionales: Cuando usted dice que quiere mostrar al usuario "todas las etiquetas", ¿quiere decir todas las etiquetas que existen para un listid dado? ¿O solo aquellos que coinciden? Y si la descripción es "% dragon%", ¿dragón es una de las etiquetas que desea devolver incluso si no está en file_tags?

1

Tendría más sentido unir las tablas.

SELECT name, synonym, description, tag_name FROM `files_list` WHERE (name LIKE '%dragon%' OR synonym LIKE '%dragon%' OR description LIKE '%dragon%' OR name LIKE '%ball%' OR synonym LIKE '%ball%' OR description LIKE '%ball%') 
OUTER JOIN files_tags on files_tags.listid = files_list.listid 

OUTER JOIN se asegurará de que todas las etiquetas se seleccionan, esto creará filas duplicadas cuando varias etiquetas por ID están disponibles, con la única diferencia de la etiqueta

+0

Solo funciona si esos son claves relacionales – KindaTechy