2012-02-23 89 views
1

令人驚訝的是,我沒有發現任何關於我的問題。我希望我沒有把它看得太糟糕。多對多SQL冗餘約束下的SQL查詢

所以,我有三張表,讓我們稱他們爲:文檔,主題,和許多一對多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 2012-02-23 19:25:10

回答

0

嗯,我想我是不是在我的描述很清楚。但我發現的解決方案是按步驟進行,而不僅僅使用SQL,而是使用PHP。

我做的第一reasearch與第一繞圈:

where Topics.PK_TOPICS=8 

我得到的結果在一個PHP數組。然後,第二個,第二個標準:

where Topics.PK_TOPICS=15 

我在另一個臨時PHP數組中獲得結果。 然後我用PHP array_intersect():

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

發現只有那些既匹配的criteriums結果。顯然,我可以重複使用$結果來交叉儘可能多的時間。所以,沒有限制搜索標準。

希望這有助於...

1

如果應顯示只有在這兩個議題8和15存在的文件,那麼無論是以下方法(加上幾個)工作 - 檢查性能的查詢計劃等。第二個對我更好。

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,我將得到所有帶有Topic 8的文檔和帶有Topic 15的文檔,但是,我只想得到帶有Topic 8和15的文檔。 – DonRamiro 2012-02-23 21:09:41

+0

現在你已經明確了,更新了我的解決方案 – kaj 2012-02-23 21:24:21

+0

哇!非常感謝 !!! – DonRamiro 2012-02-23 21:39:38

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;