2011-06-24 4 views
1

J'essaie de faire une requête de recherche entre un tableau de termes clés et de pages.Moteur de recherche MySQL - AND mots-clés

Considérez les tableaux suivants.

PAGES

 
page_id page_name 
1  cats 
2  dogs 
3  humans 

KEYWORDS

 
key_id key_name key_page_id 
1  purz  1 
2  puzy  1 
3  ruff  2 
4  john  3 
5  purz  3 

Lorsque les termes de recherche sont Purz ET Puzy Je veux que les résultats de la requête pour renvoyer uniquement id page 1.

 
SELECT page_id FROM PAGES, KEYWORDS 
WHERE (key_name='purz OR key_name='puzy') AND key_page_id = page_id; 

Retours

 
page_id 
1 
3 

Je suis désireux

 
page_id 
1 

Parce que les deux sont liés Purz ET Puzy Cats.

+0

J'ai également considéré qu'il pourrait être plus efficace de créer une table de mots-clés temporaire mise à jour à partir de mots-clés où je peux garantir l'unicité. Je pense aussi à l'évolutivité ici. –

+0

Vous n'avez pas besoin de table temporaire, ajoutez seulement un index unique sur 2 champs: key_name et key_page_id dans la table KEYWORDS. Cela vous garantira que vous n'avez pas deux fois le même mot-clé pour la même page. ALTER TABLE 'KEYWORDS' AJOUTER UNIQUE ( ' key_name', 'key_page_id' ) –

+0

Désolé, je sais que mon exemple est abstrait et n'a peut-être pas précisé le besoin de ces mots clés en double –

Répondre

1

Je crois ce faire, vous devez vous inscrire sur la table des mots-clés à deux reprises:

SELECT p.page_id 
FROM pages p 
JOIN keywords k ON (k.key_page_id = p.page_id) 
JOIN keywords k2 ON (k2.key_page_id = p.page_id) 
WHERE k.key_name='purz' 
    AND k2.key_name='puzy'; 
0

ne sais pas si cela fonctionne vraiment, mais vous pouvez essayer de se joindre à la table des mots-clés avec lui-même pour chaque searchterm, par exemple quelque chose comme:

SELECT searchterm1.key_page_id as page_id FROM KEYWORDS searchterm1 
INNER JOIN KEYWORDS searchterm2 
ON (searchterm1.key_page_id = searchterm2.key_page_id) 
WHERE searchterm1.key_name='purz' AND searchterm2.key_name='puzy'; 

vous même pas besoin de se joindre à la table PAGES, à moins que vous avez besoin page_name retourné ainsi

0
SELECT p.page_id, COUNT(key_id) AS keyword_all 
FROM PAGES p 
JOIN KEYWORDS ON key_page_id = page_id 
GROUP BY page_id 
HAVING keyword_all = (
    SELECT COUNT(key_id) AS found_k 
    FROM KEYWORDS 
    WHERE key_page_id = p.page_id 
     AND (
     key_name = 'purz' 
     OR key_name = 'puzy' 
    ) 
) 

Ce que j'ai fait ici est d'obtenir seulement des pages dont le nombre total de mots-clés correspondent aux mots-clés que nous recherchons.

De cette façon, vous n'avez pas besoin de vous joindre plusieurs fois. Modifiez uniquement la condition WHERE dans la sous-requête en fonction des mots-clés que vous recherchez.