2012-02-23 5 views
1

驚いたことに、私の質問については何も見つかりませんでした。私はそれがあまりにも悪くはないと思う。多対多の冗長制約付きSQLクエリ

だから、私は3つのテーブルを持って、のは、それらを呼び出すみましょう:ドキュメント、トピック、および多対多のtransitionnalテーブルDocumentsTopicsは

私が「含まれている」ことを、いくつかのドキュメントを探すためにできるように必要なトピック8と15のみ。私はどのように行いますか ?次の例では:

select Documents.title from Documents 
inner join DocumentsTopics 
on Documents.PK_DOC = DocumentsTopics.FK_DOC 
inner join Topics 
on DocumentsTopics.FK_TOPICS = Topics.PK_TOPICS 

where Topics.PK_TOPICS=8 and Topics.PK_TOPICS=15; 

「どこ」は明らかに不可能です。助けてくれる人にはおかげさまで!

クリストフ

+1

関係演算子は、一般に[として知られている、[部門](http://en.wikipedia.org/wiki/Relational_algebra#Division_.28.C3.B7.29)であります"すべての部品を供給する供給者"](http://www.dbdebunk.com/page/page/772076.htm)。考慮すべき事項:[正確な除算または除算と除算?](http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/ ); (たとえば、供給する部品リストが空のセットである場合、論理的にすべての供給元がそれを供給することができるが、供給業者に評価するのはより現実的である)。 – onedaywhen

答えて

0

まあ、私は私が私の説明では非常に明確ではなかったと思います。しかし、私が知った解決策は、SQLだけでなくPHPを使って、手順を進めることです。

私は最初のクリテリウムで最初のreasearchを行います

where Topics.PK_TOPICS=8 

私はPHPの配列で結果を取得します。そして、第2の判断基準を有する第二1:

where Topics.PK_TOPICS=15 

は、私は別の、一時的なPHPの配列で結果を取得します。 そして、私はPHPのarray_intersect()を使用します。両方criteriumsに一致しているだけの結果を見つけることが

$results = array_intersect($results, $temp_results); 

を。明らかに、$結果を再利用して、必要なだけ多くの時間を渡すことができます。したがって、検索条件に制限はありません。

・ホープこのヘルプ...あなたが必要と

1

両方トピック8と15が存在する文書のみが表示されなければならない場合は、下記のアプローチ(プラスさらにいくつかの)仕事の後、どちらか - は、パフォーマンスのクエリプランなどをご確認ください。 2番目は私にとってより良い結果を出します。

select distinct d.title 
from Documents d 
    inner join DocumentsTopics dt8 on dt8.fk_doc = d.pk_doc and dt8.fk_topics = 8 
    inner join DocumentsTopics dt15 on dt15.fk_doc = d.pk_doc and dt15.fk_topics = 15 

select d.title 
from Documents d 
where exists (select * from DocumentsTopics where fk_topics = 8 and fk_doc = d.pk_doc) 
    and exists (select * from DocumentsTopics where fk_topics = 15 and fk_doc = d.pk_doc) 
+0

お返事ありがとうございました!問題は、ORで、トピック8のすべてのドキュメントとトピック15のドキュメントを取得しますが、トピック8と15のドキュメントのみを取得したいと考えています。 – DonRamiro

+0

これで、私は私の解決策を更新 – kaj

+0

うわー!どうもありがとう !!! – DonRamiro

1
select Documents.title from Documents 
join DocumentsTopics on Documents.PK_DOC = DocumentsTopics.FK_DOC 
join Topics on DocumentsTopics.FK_TOPICS = Topics.PK_TOPICS 
where Topics.PK_TOPICS=8 or Topics.PK_TOPICS=15;