Выберите из таблицы на основе значений в другой таблице в MySQL - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть две простые таблицы в базе данных

бумага

ID Title                              Author 
1  A study of turtles                 Mary
2  Dietary habits of ducks            Kate
3  Similarities of turtles and cats   Fred

ключевые слова

ID Keyword                            
1  turtles                 
2  ducks          
3  turtles
3  cats

Я бы хотел выбрать все статьи, в которых есть ключевое слово "черепахи". То есть он вернул бы

ID Title                              Author 
1  A study of turtles                 Mary
3  Similarities of turtles and cats   Fred

или

ID Title                              Author   Keyword
1  A study of turtles                 Mary     turtles
3  Similarities of turtles and cats   Fred     turtles

Меня не интересует, включено или нет название ключевого слова.

Я думаю, что мне нужно использовать select и внутреннее объединение с использованием псевдонима, но синтаксис не совсем правильный.

Я пытался

select * from (select papers.*, keywords.* from papers inner join keywords on papers.id = keywords.id) where keyword = "turtles";

что дает ошибку Every derived table must have its own alias

Я пытался следовать В чем ошибка «Каждая производная таблица должна иметь свой собственный псевдоним» в MySQL?

select * from (select papers.*, keywords.* from 
    (papers inner join keywords on papers.id = keywords.id) as T) 
    as T) 
    where keyword = "turtles";

, который возвращает синтаксическую ошибку.

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

РЕДАКТИРОВАТЬ: Уточняю, что я хочу вернуть идентификаторы, которые соответствуют ключевому слову "черепаха" из ключевого слова таблицы (1 и 3 в этом примере), затем выберите из таблицы документов строки, соответствующие этим идентификаторам. Я не ищу ключевые слова в заголовке.

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Мне очень нравится Тим ответ

Вот моя собственная попытка

SELECT
  *
 FROM
   papers p
   INNER JOIN keywords k ON p.`Title`  LIKE CONCAT('%', k.keyword ,'%')
  ;

SQLFiddle

Как прокомментировал Тимв этом ответе подстроки также будут соответствовать полному совпадению слов. Чтобы решить эту проблему, необходимо добавить пробелы в параметры%

SELECT
  *
 FROM
   papers p
   INNER JOIN keywords k ON p.`Title`  LIKE CONCAT('% ', k.keyword ,' %')
  ;
0 голосов
/ 17 сентября 2018

Простое соединение (внутреннее):

SELECT *
FROM keywords k
JOIN papers p USING (id)
WHERE k.keyword='turtles'
0 голосов
/ 17 сентября 2018

Мы можем попытаться выполнить поиск по каждому названию статьи по всему набору ключевых слов и найти совпадение. Оператор REGEXP полезен здесь. В частности, мы ищем совпадения \bkeyword\b с любым названием статьи.

SELECT p.*
FROM papers p
WHERE EXISTS (SELECT 1 FROM keywords k
              WHERE p.title REGEXP CONCAT('[[:<:]]', k.keyword, '[[:>:]]'));

Демо

Изменить:

Если вы просто хотите найти заголовки статей по одному известному ключевому слову, например, turtles, затем воспользуйтесь этим упрощением:

SELECT *
FROM papers
WHERE title REGEXP '[[:<:]]turtles[[:>:]]';
...