2011-06-20 14 views
0

タグ検索の結果を絞り込むにはどうすればよいですか?例えばPHPとMySQL:タグの検索結果を絞り込む方法は?

、私は以下のこのクエリを試してみましたpg_id 10

でページを取得したいroot_mm_tagged_pages

tag_id pg_id 
1  10 
1  20 
2  10 

root_tags

tag_id tag_name 
1  A 
2  B 

テーブルの

テーブルそれは空を返します:

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 

注:私はそれは常に動的である$_REQUESTを通じてAの値を取得します。 Bは常に固定です。

アイデア?

ありがとうございました。

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

感謝。私はあなたがそれが2人の間に「AND」ではなく「OR」であることを望んでいると仮定しています。 – judda

答えて

0

私の答え、単一のフィールドが同時に2つの値を持つことはできません

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

OR root_tags.tag_name = 'B'を意味しますか?

EDIT 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''になるとtrueまたはfalseに評価され、もしそれが真実なら、それは続行し、 'AND root_tags.tag_name = 'B''を見てください。それは2つの値になることができないので、常にfalseになります。 –

1

SELECT *登録しようAAT AS(At.tag_id = root_mm_tagged_pa​​ges.tag_id ON 時とroot_tagsを登録しようroot_mm_tagged_pa​​ges

* FROM を選択)FROM

(SELECT * FROM root_mm_tagged_pa​​ges

はAat.pg_id = Bbt.pg_id にBBT AS Bt.tag_id = root_mm_tagged_pa​​ges.tag_id ONのBt としてroot_tags)に参加WHERE Aat.tag_name = 'A' AND Bbt.tag_name = 'B'

ORDER BY AAT DESC

.created_onこれは私が考えて遅くする必要があり、おそらく、別のSOLNのために私は尋ねた同様の質問に:)

+0

ありがとうございます。 '#1054 - 'on clause'の中の 'root_tags.tag_id'の未知の列... – laukok

+0

もう一度試してみてください。私はちょうどコピー&ペーストの前にタイプミスがあります。 – Tommy

+0

もう一度ありがとうございます。編集されたバージョンは今や理にかなっています! lol それをテストし、空の結果を返す... :( – 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 
あなたのケースでは10

、それは次のようになります。

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'を有する任意の結果が返されます。

あなたがより多くの「一般的なケース」の検索アルゴリズムのために行っている場合は、私はそれのような改善することができると思う:

少なくとも1個の一致するタグですべての結果を返します
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 

が、最初に最も一致するタグを持つタグを使用します。トミーのヒント由来

+0

提案されたクエリをテストしましたが、空の結果を返します... ... – laukok