2009-02-01 9 views
2

J'ai 2 tables:MySQL NOT LIKE requête ne fonctionne pas

  • messages
  • balises

table tags est structuré comme celui-ci:

  • post_id
  • tag

Donc, pour chaque balise qui est donnée pour une publication, je crée un enregistrement dans la table des balises. Si un article a 10 étiquettes, il y aura 10 enregistrements dans la table des étiquettes avec ce post_id.

J'essaye maintenant de construire une page de recherche où les utilisateurs peuvent faire une recherche pour des postes où les étiquettes ne contiennent pas les mots-clés donnés. Cela crée un problème cependant. Une requête comme:

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

ne fonctionne pas parce que si un poste a obtenu 6 balises et un d'entre eux a obtenu le mot-clé, il sera toujours retourné parce que les 5 autres enregistrements de la table des balises ne sont pas ce mot-clé.

Quelle est la meilleure façon de résoudre ce problème? Toute autre façon que de créer une nouvelle colonne dans la table posts qui stocke toutes les balises séparées par des virgules utilisées uniquement pour la recherche ??

Répondre

7

Assurez-vous que vous avez des index ou cela se produiront très mal:

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 
) 

Cette obtient une liste de tous les postes, l'exclusion de ceux qui ont une étiquette correspondant à l'étiquette que vous avez spécifiée. (Votre requête orginal fait référence à une table « emploi » Je suppose que était une faute de frappe pour « postes »..)

Table aliases faire cela un peu plus propre:

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 
) 

Ensuite, je crée ces indices:

Posts: id, tag_id 
Tags: post_id, tag 

Ensuite, exécutez votre requête avec « explain » pour voir si elle est fonctionne bien. Mettez à jour votre question avec les résultats et quelqu'un vous conseillera. Le réglage d'index est plus d'essais et d'erreurs qu'autre chose, donc le test est vraiment nécessaire.

+1

J'étais juste en train de poster que ... :( – Jon

+0

Dois-je créer un index sur la colonne de l'étiquette? –

+0

Un index sur la colonne d'étiquette ne vous aidera pas car vous recherchez tous les enregistrements. vos colonnes post_id – cjk

Questions connexes