2014-09-28 4 views
0

Я пытаюсь использовать внутреннее соединение для поиска относительных строк.Использование MySQL для многих операторов select для поиска относительных строк

Но, похоже, ничего не возвращает. Пожалуйста, порекомендуйте.

В принципе, я разложил все ключевые слова с исходного названия страницы и описания каждой статьи. Поэтому, когда я прихожу к поиску, я могу запросить таблицу ключевых слов.

здесь является статей с ключевыми словами

- Таблица схемы

CREATE TABLE article   (id INT, title TEXT, description TEXT); 
CREATE TABLE keyword   (id INT, keyword VARCHAR(255)); 
CREATE TABLE article_keyword (article_id INT, keyword_id INT); 

- Добавить статью 1

insert into article set 
id = 1, 
title = "my text book like a black hole", 
description = "I have a text book. Any people who read it and after days they will disappear. etc..."; 

- Добавление ключевых слов для статьи 1

insert into keyword set 
id = 1, 
keyword = "text book"; 

insert into keyword set 
id = 2, 
keyword = "black hole"; 

insert into article_keyword set 
article_id = 1, 
keyword_id = 1; 

insert into article_keyword set 
article_id = 1, 
keyword_id = 2; 

- Добавить СТАТЬЮ 2

insert into article set 
id = 2, 
title = "the fact of deep space black hole", 
description = "More researches are telling fake story about black holes is exists. But my alien friend tell me it is wrong ... etc"; 

- Добавление ключевых слов для статьи 2

insert into keyword set 
id = 3, 
keyword = "research"; 

insert into keyword set 
id = 4, 
keyword = "alien"; 

insert into article_keyword set 
article_id = 2, 
keyword_id = 2; 

insert into article_keyword set 
article_id = 2, 
keyword_id = 3; 

insert into article_keyword set 
article_id = 2, 
keyword_id = 4; 

- Поиск с помощью "текст книги", как ожидается 1 статьи

SELECT article.id, title FROM article 
JOIN article_keyword ak ON ak.article_id = article.id 
JOIN keyword k1   ON ak.keyword_id = k1.id 
WHERE k1.keyword = "text book" 

- Нахождение с помощью "черной дыры", как ожидается 2 статьи

SELECT article.id, title FROM article 
JOIN article_keyword ak ON ak.article_id = article.id 
JOIN keyword k2   ON ak.keyword_id = k2.id 
WHERE k2.keyword = "black hole" 

- При поиске бо ok включает все эти ключевые слова, а затем не получает их.

SELECT article.id, title FROM article 
JOIN article_keyword ak ON ak.article_id = article.id 
JOIN keyword k1   ON ak.keyword_id = k1.id 
JOIN keyword k2   ON ak.keyword_id = k2.id 
WHERE k1.keyword = "text book" 
AND k2.keyword = "black hole"; 

Любая идея mysql не может вернуть мне статью 1?

Что-то не так в этом вопросе?

Спасибо!

ответ

0

Да, ваш запрос не так, как первый, где положение ограничивает соединение между article_keyword и ключевое слово (k1) в строке с ключевым словом = 1 и article_id = 1 и ни одна строка не будет соответствовать второй, где положение для ключевого слова 2.

Если вы хотите статьи с несколькими ключевыми словами вы можете использовать этот запрос:

SELECT article.id, title 
FROM article 
JOIN article_keyword ak ON ak.article_id = article.id 
JOIN keyword k   ON ak.keyword_id = k.id 
WHERE k.keyword = "text book" 
OR k.keyword = "black hole" 
GROUP BY article.id, title 
HAVING COUNT(keyword) = 2 
-1

Ваши первые 2 SELECT заявления работают нормально. В последнем SELECT заявление используется DISTINCT и в пункте WHERE пункт OR вместо AND.

SELECT DISTINCT article.id, title FROM article 
JOIN article_keyword ak ON ak.article_id = article.id 
JOIN keyword k1   ON ak.keyword_id = k1.id 
JOIN keyword k2   ON ak.keyword_id = k2.id 
WHERE k1.keyword = "text book" 
OR k2.keyword = "black hole"; 
+0

Это не будет работать, если цель состоит в том, чтобы найти статьи со всеми ключевыми словами, указанных в этом будет соответствовать статьям с любым (и не все) или ключевые слова. – jpw

Смежные вопросы