Поиск в двух таблицах - PullRequest
       25

Поиск в двух таблицах

6 голосов
/ 25 января 2009

У меня в настоящее время есть две таблицы:

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
);

Если кто-то использует ключевое слово «шар дракона», в данный момент я использую следующий запрос для поиска возможных совпадений в my_list:

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%' 

Я не уверен, как искать в обеих таблицах, используя один запрос. Я хочу показать пользователю следующие данные в результатах поиска: имя, синоним, описание и все теги.

Мои вопросы 1. Есть ли способ сделать текущий запрос MySQL короче? 2. Как я могу комбинировать это с files_tags таблицей, - показать строки из files_list, у которых есть совпадение в files_tags, но не в files_list? - показать строки из files_list, у которых есть совпадение в files_list, but may not in files_tags`?

Текущий результат отображается на http://hsbsitez.com/

Ответы [ 2 ]

1 голос
/ 16 сентября 2016

Было бы разумнее присоединиться к столам.

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 обеспечит выбор всех тегов; при наличии нескольких тегов для каждого идентификатора будут созданы повторяющиеся строки, единственное отличие - тег

0 голосов
/ 26 января 2009

Будьте внимательны при использовании объединения, чтобы получить нужные столбцы для каждого объединенного запроса. И в этом случае подзапрос, кажется, имеет больше смысла:

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');

Некоторые дополнительные вопросы: Когда вы говорите, что хотите показать пользователю «все теги», вы имеете в виду все теги, которые существуют для данного списка? Или только те, которые соответствуют? И если описание типа «% dragon%», является ли dragon одним из тегов, которые вы хотите вернуть, даже если его нет в file_tags?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...