2015-06-04 279 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。如果沒有,我沒有得到兩個關鍵字匹配(這是我的問題),但匹配一個關鍵字或其他。再次感謝您的快速回答。 –