2011-06-24 107 views
1

我试图在关键术语和页面的表之间进行搜索查询。MySQL搜索引擎 - AND关键字

请考虑以下表格。

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两者都与猫。

+0

另外我认为,从关键字更新我可以保证唯一性的临时关键字表可能更有效。我在这里也想到了可伸缩性。 –

+0

您不需要临时表,只需在KEYWORDS表中的2个字段中添加唯一索引:key_name和key_page_id。这会保证你没有两次在同一页面上拥有相同的关键字。 ALTER TABLE' KEYWORDS' ADD UNIQUE( 'key_name', 'key_page_id' ) –

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

不知道这还真管用,但你可以尝试以自己参加的关键词表中的每个搜索关键词,如是这样的:

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

你甚至不会需要的页面表加入,除非你需要PAGE_NAME返回的还有

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条件。