2011-06-24 140 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條件。