2009-02-01 64 views
2

我有2個表:MySQL的NOT LIKE查詢不工作

  • 帖子
  • 標籤

標籤表的結構是這樣的:

  • POST_ID
  • 標籤

因此,對於發佈的每個標籤,我都會在標籤表中創建一條記錄。如果一篇文章有​​10個標籤,那麼標籤表中會有10條記錄與該post_id。

我現在正在嘗試構建一個搜索頁面,用戶可以在其中搜索標籤不包含給定關鍵字的帖子。但這會產生一個問題。查詢,如:

SELECT DISTINCT posts.id, posts.title, posts.content 
    FROM jobs, tags 
    WHERE tags.tag NOT LIKE '%$keywords%' AND posts.id=tags.post_id 

不工作,因爲如果一個職位已經得到了6個標籤,其中一人已經拿到了關鍵字,它仍然會返回因爲其他5個記錄標記表中沒有該關鍵字。

什麼來解決這個最好的方法是什麼?除了在posts表中存儲所有用於搜索的逗號分隔標籤的新列以外,還有其他方法嗎?

回答

7

確保您有索引,或者這將導致性能非常差:

SELECT posts.id, posts.title, posts.content 
FROM posts 
WHERE NOT EXISTS (
    SELECT post_id from tags 
    WHERE tags.tag LIKE '%$keywords%' 
    AND posts.id=tags.post_id 
) 

這得到所有的職位名單,但不包括那些有標籤匹配您指定的標籤。 (你的原單查詢中引用的「工作」表我認爲是爲「帖子」一個錯字。)

Table aliases使這一點清潔:

SELECT p.id, p.title, p.content 
FROM posts p 
WHERE NOT EXISTS (
    SELECT t.post_id from tags t 
    WHERE t.tag LIKE '%$keywords%' 
    AND p.id=t.post_id 
) 

然後,我會創建這些索引:

Posts: id, tag_id 
Tags: post_id, tag 

然後,使用'explain'運行您的查詢以查看它是否運行良好。用結果更新你的問題,有人會提供進一步的建議。索引調整比其他任何事情都更多的是試驗和錯誤,所以測試確實是必要的

+1

我只是在張貼的過程中...... :( – Jon 2009-02-01 13:34:36