MySQL NOT LIKE query not working

10,231

Make sure you have indexes or this will perform very badly:

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
)

This gets a list of all posts, excluding those that have a tag matching the tag you specified. (Your orginal query referenced a 'jobs' table. I assumed that was a typo for 'posts'.)

Table aliases make this a little cleaner:

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
)

Then, I'd create these indexes:

Posts: id, tag_id
Tags: post_id, tag

Then, run your query with 'explain' to see if it's performing well. Update your question with the results and someone will offer further advice. Index tuning is more trial and error than anything else so testing really is necessary.

Share:
10,231
gregory boero.teyssier
Author by

gregory boero.teyssier

https://ali.actor

Updated on June 04, 2022

Comments

  • gregory boero.teyssier
    gregory boero.teyssier almost 2 years

    I have 2 tables:

    • posts
    • tags

    Tags table is structured like this:

    • post_id
    • tag

    So for every tag that's given for a post, I create a record in the tags table. If a post has 10 tags, there will be 10 records in tags table with that post_id.

    I'm now trying to build a search page where users can do a search for posts where tags do not contain the given keywords. This creates a problem though. A query like:

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

    doesn't work because if a post has got 6 tags and one of them has got the keyword, it will still be returned because the other 5 records in the tags table don't have that keyword.

    What's the best way to solve this? Any way other than creating a new column in the posts table which stores all the comma-separated tags used only for search??