2011-06-20 42 views
0

如何縮小我的標籤搜索結果?PHP&MySQL:如何縮小標籤搜索結果?

例如,

root_tagsroot_mm_tagged_pages

tag_id pg_id 
1  10 
1  20 
2  10 

tag_id tag_name 
1  A 
2  B 

我想用pg_id 10

得到的頁面我試着用下面這個查詢但它返回空:

SELECT * 
FROM root_tags 

LEFT JOIN root_mm_tagged_pages 
ON root_mm_tagged_pages.tag_id = root_tags.tag_id 

WHERE root_tags.tag_name = 'A' 
AND root_tags.tag_name = 'B' 

ORDER BY root_mm_tagged_pages.created_on DESC 

注:我得到的A通過$_REQUEST的值,因此它始終是動態的。但B始終是固定的。

任何想法?

謝謝。

+0

單場不能同時有兩個值。我假設你希望它在兩者之間是「或」而不是「和」。 – judda

回答

0

我的答案,從湯米的提示衍生

SELECT * FROM 
(SELECT root_mm_tagged_pages.tag_id as Atag_id, root_mm_tagged_pages.pg_id as Apg_id, At.tag_name as Atag_name FROM root_mm_tagged_pages 

LEFT JOIN root_tags as At ON At.tag_id = root_mm_tagged_pages.tag_id) AS Aat JOIN 

(SELECT root_mm_tagged_pages.tag_id as Btag_id, root_mm_tagged_pages.pg_id as Bpg_id, Bt.tag_name as Btag_name FROM root_mm_tagged_pages 

LEFT JOIN root_tags as Bt ON Bt.tag_id = root_mm_tagged_pages.tag_id) AS Bbt on Aat.Apg_id = Bbt.Bpg_id WHERE Aat.Atag_name = 'A' AND Bbt.Btag_name = 'B' 

感謝

1
WHERE root_tags.tag_name = 'A' 
AND root_tags.tag_name = 'B' 

你的意思是OR root_tags.tag_name = 'B'

編輯 NVM,但怎麼樣:

WHERE root_tags.tag_name IN ('A', 'B') 
+0

他想要「AND」搜索,這意味着A和B必須共存。 – Tommy

+0

是A和B必須共存... – laukok

+0

我不明白... mySQL將測試每一行,當涉及到WHERE root_tags.tag_name ='A''時,它將評估爲真或假如果它是真的,那麼它會繼續看到'AND root_tags.tag_name ='B',然後它總是假,因爲它不能是兩個值 –

1

SELECT * FROM(SELECT * FROM root_mm_tagged_pa​​ges

JOIN root_tags如在 ON At.tag_id = root_mm_tagged_pa​​ges.tag_id)AS AAT JOIN

(SELECT * FROM root_mm_tagged_pa​​ges

JOIN AS BBT root_tags如Bt基因 ON Bt.tag_id = root_mm_tagged_pa​​ges.tag_id)上Aat.pg_id = Bbt.pg_id WHERE Aat.tag_name = 'A' AND Bbt.tag_name = 'B'

ORDER BY AAT .created_on DESC

這應該是緩慢的,我認爲,也許再等SOLN :)

+0

謝謝。測試它,但我得到一個錯誤 - '#1054 - 未知列'root_tags.tag_id'在'子句'... – laukok

+0

再次測試,我有一個錯字,因爲我只是複製和粘貼:) – Tommy

+0

再次感謝。編輯後的版本現在有意義!大聲笑 測試它,並返回一個空的結果,雖然... :( – laukok

0

在類似的問題,我問, 「尼克rulez」 給了一個相當令人滿意的答案: MySQL query equivalent of "AND", whereas "IN" is "OR"?

select x 
from table 
where y in (2,3) 
group by x 
having count(distinct(y)) = 2 

在你的情況,這將是:

select pg_id 
from root_mm_tagged_pages 
where tag_id in ('A', 'B') 
group by pg_id 
having count(distinct(tag_id)) >= 2 

這將返回至少具有標籤'A''B'任何結果。

但是,如果你要爲一個更「一般情況下,」搜索算法,我認爲還可以提高這樣:

select pg_id 
from root_mm_tagged_pages 
where tag_id in (/* any amount of tags */) 
group by pg_id 
having count(distinct(tag_id)) > 0 
order by count(distinct(tag_id)) desc 

這將返回每個結果至少有1匹配的標籤,但首先與最匹配的標籤進行比較。

+0

謝謝。測試了兩個建議的查詢,然後它們返回空結果,儘管...... :( – laukok