2012-10-31 68 views
0

我甚至不知道如何想出一個好標題的人,所以我希望我可以描述一個正確的方式:)選擇具有重疊與其他表

所以我有一個人表我的問題,並且它通過Person Person關鍵字與關鍵字具有N:N關係。

然後我也有一個搜索表,它也通過表SearchKeywords與關鍵字有N:N的關係。

現在的人可以有關鍵字A和B的關係,和搜索記錄可以與該關鍵字A的關係和C.

現在,我想在我的結果集的人,因爲它至少一個(在'A'中)搜索記錄具有的關鍵字。

我也想誰擁有「A」的人,一個用「C」,一個以「A」和「C」,而不是一個只有B.

所以這是一個比賽上兩份名單,但我不知道從哪裏開始建立這樣一個說法......

+1

我覺得有點難以理解。是否可以顯示數據庫結構的圖像或類似的東西? – Mr47

+0

我瞭解這些關係,但是您想查詢哪張表?你想要一個「搜索」或「人」的列表嗎? – Spikeh

+2

這最好通過包含一些示例數據和您期望的結果來描述。 – MatBailie

回答

1

所以,你有三個人...

declare @persons table (id int identity(1,1), name varchar(10)) 
insert @persons (name) values ('Babs'),('Ken'),('Neville'),('Sue') 

巴布斯具有A和B,肯A和C ,內維爾只有B而蘇只有C

declare @personkeywords table (personid int, keyword varchar(5)) 
insert @personkeywords values (1,'a'),(1,'b'),(2,'a'),(2,'c'),(3,'b'),(4,'c') 

的搜索是A或C

declare @searchkeywords table (searchid int, keyword varchar(5)) 
insert @searchkeywords values (1,'a'),(1,'c') 

所以......

select distinct persons.* 
from @persons persons 
    inner join @personkeywords personkeywords on persons.id = personkeywords.personid 
    inner join @searchkeywords searchkeywords on personkeywords.keyword = searchkeywords.keyword 
where 
    searchkeywords.searchid = 1 

給人

1  Babs 
2  Ken 
4  Sue 
1

雖然我沒有很多信息的工作,以下至少應該幫助你...

SELECT s.SearchID, k.Keyword, p.PersonID, p.Name 
FROM Search s 
INNER JOIN SearchKeywords sk ON s.SearchID = sk.SearchID 
INNER JOIN Keywords k ON sk.KeywordID = k.KeywordID 
LEFT OUTER JOIN PersonKeywords pk ON k.KeywordID = pk.KeywordID 
LEFT OUTER JOIN Person p ON pk.PersonID = p.PersonID 
WHERE k.Keyword = 'mykeyword' 
GROUP BY s.SearchID, k.Keyword, p.PersonID, p.Name