2015-06-04 234 views
4

寻找匹配两个关键字的文章(不仅仅是其中之一)。MySQL搜索匹配多个关键字

我猜为什么下面的MySQL查询返回不匹配的原因是匹配“气候”的关键字和匹配“回收”的关键字在t_keywords表中不是同一行。你将如何继续?

SELECT t_posts.id, t_posts.title 
FROM t_posts, t_keywords, t_posts_keywords 
WHERE t_posts.id = t_posts_keywords.id_post 
AND t_keywords.id = t_posts_keywords.id_keyword 
AND t_keywords.keyword = "climate" 
AND t_keywords.keyword = "recycling" 
GROUP BY t_posts.id 

回答

0

您可以使用IN。像这样:

SELECT t_posts.id, t_posts.title 
FROM t_posts, t_keywords, t_posts_keywords 
WHERE t_posts.id = t_posts_keywords.id_post 
AND t_keywords.id = t_posts_keywords.id_keyword 
AND t_keywords.keyword IN("climate","recycling") 
GROUP BY t_posts.id 

你也可以用OR之间。就像这样:

SELECT t_posts.id, t_posts.title 
FROM t_posts, t_keywords, t_posts_keywords 
WHERE t_posts.id = t_posts_keywords.id_post 
AND t_keywords.id = t_posts_keywords.id_keyword 
AND 
(
    t_keywords.keyword ="climate" OR 
    t_keywords.keyword ="recycling" 
) 
GROUP BY t_posts.id 
2
SELECT t_posts.id, t_posts.title 
FROM t_posts, t_keywords, t_posts_keywords 
WHERE t_posts.id = t_posts_keywords.id_post 
AND t_keywords.id = t_posts_keywords.id_keyword 
AND t_keywords.keyword IN ('climate', 'recycling') 
GROUP BY t_posts.id HAVING count(t_keywords.id) = 2 

您已经岗位群,因此,所有你需要的是检查特定职位在原始数据的两行,一个与每个关键字 - 这就是具有。如果你有可变数量的关键字匹配,那么“2”也必须是可变的,用应用程序的正确数量代替。

+0

工作正常,谢谢!它也可能与WHERE t_keywords.keyword LIKE“climate%”(LIKE而不是=) –

+0

“AND(t_keywords.keyword LIKE'climate%'或t_keywords.keyword LIKE'recycling%')”(IN只是简化OR),但如果'climate%'匹配多个关键字,那么“= 2”部分可能不起作用,因此您可能将其更改为“> = 2”,但会返回匹配'climate1'的行和'climate2'没有触及'回收' – jkavalik

1

回到基础知识:http://www.w3schools.com/sql/sql_and_or.asp

如果您的关键字是“气候” - 拿什么您的t_keywords.keyword结果=“气候”操作为真,你的代码的下一部分(t_keywords.keyword = “回收”)将始终为假。
TRUE AND FALSE总是表示FALSE - 意味着您的选择将始终为空。

您可以使用运营商或者您可以使用()和OR这样的:

WHERE t_posts.id = t_posts_keywords.id_post 
AND t_keywords.id = t_posts_keywords.id_keyword 
AND (t_keywords.keyword = "climate" OR t_keywords.keyword = "recycling") 
GROUP BY t_posts.id 
1

你可以试试这个队友:

SELECT 
    t_posts.id, t_posts.title 
FROM 
    t_posts 
    INNER JOIN t_posts_keywords ON t_posts_keywords.id_post = t_posts.id 
    INNER JOIN t_keywords ON t_keywords.id = t_posts_keywords.id_keyword 
WHERE 
    t_keywords.keyword IN ('climate', 'recycling'); 

E:这是基于你的给出查询以从t_keywords中查找具有关键字值'climate'或'recycling'的记录,该记录链接到t_posts_keywords数据透视表到t_posts以用于输出。

+0

谢谢!使用这样的INNER JOIN查询看起来好多了。但要回答我的问题,需要GROUP BY t_jobs.id在最后使用count(t_keywords.id)= 2,因为user1786423在他的回答中提出了 –

+0

@Benj。感谢你的回应;)哦,我明白了,那T_jobs会从哪里来?我在你使用的问题和示例查询中没有看到它。无论如何,谢谢你〜 – Avidos

+0

对不起,不是t_jobs而是t_posts!所以,我需要在查询结束时使用GROUP BY t_posts.id HAVING count(t_keywords.id)= 2。如果没有,我没有得到两个关键字匹配(这是我的问题),但匹配一个关键字或其他。再次感谢您的快速回答。 –