MySQL搜索引擎 - AND关键字

时间:2011-06-24 10:18:20

标签: mysql

我正在尝试在关键字词和网页表之间进行搜索查询。

考虑以下表格。

PAGES

page_id  page_name
1        cats
2        dogs
3        humans 

关键字

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

如果搜索词是purz和puzy,我希望查询结果只返回页面ID 1。

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

返回

page_id
1
3

我想要

page_id
1

因为只有purz和puzy都与猫有联系​​。

3 个答案:

答案 0 :(得分:1)

我相信要做到这一点,你必须两次加入关键字表:

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';

答案 1 :(得分:0)

不确定这是否真的有效,但你可以尝试为每个searchterm加入关键字表,例如:

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';

你甚至不需要加入PAGES表,除非你还需要返回page_name

答案 2 :(得分: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'
    )
  )

我在这里所做的只是获取关键字总数与我们查找的关键字匹配的网页。

这样您就不需要多次加入。仅根据您查找的关键字更改子查询中的WHERE条件。