2011-03-15 103 views
-2

我有3個表格:關鍵詞,授權KeyConn,授權。它被設置的方式,每個「授予」具有相關聯的「關鍵詞」,其被存儲在關鍵字表作爲這樣:如何在C#中執行此MySQL查詢?

KeyWords Table

每個「關鍵字」關聯/連接到一個特定的「許可」在GrnatsKeyConn表作爲這樣:

GrantsKeyConn Table

...,使得多個「關鍵字」可以被關聯/連接到一個「許可」。最後,每個「授予」存儲在資助表這樣:

Grants Table

我想通過在文本框中指定的關鍵字來過濾掉補助。因此,假設我指定了關鍵字「test,new,final」......那麼結果將只篩選出與這些關鍵字相關聯的授權;它不必產生只有3個與它們相關的關鍵字的贈款;它可以導致具有1,2,3,...,所有指定關鍵字的贈款。 另外,如果一個資助有超過1個與其關聯的關鍵字,我不希望它在結果中顯示多次。

那麼我該如何做這個查詢?我不想從KeyWords表中選擇一個關鍵字的ID,然後使用該ID進入GrantsKeyConn表以獲取關聯的授權,然後轉到Grants表以提取正確的授權。如果是這樣,我將如何做到這一點?

讓我知道是否需要進一步澄清我的問題。

+0

請檢查您選擇的答案,因爲這是一個比我的回答慢得多的交易。我真的認爲這是建議人們使用一種目的永遠不會實現的方法。 – Aidiakapi 2011-03-16 15:51:45

+0

@Aidiakapi ...您的解決方案能夠返回不同的結果嗎?例如,如果某個授權與其關聯的關鍵字超過1個,我只希望該授權僅顯示一次,而不是一次顯示與其關聯的每個關鍵字。 「DISTINCT」主意在哪裏起作用? – Hristo 2011-03-16 16:09:41

+0

'DISTINCT'總是出現在'SELECT'之後,就像另一個例子。 – Aidiakapi 2011-03-17 10:59:53

回答

1

您可以使用此:

SELECT 
--Choose the columns you want here 
FROM 
Grants 
INNER JOIN GrantsKeyConn ON Grants.ID = GrantsKeyConn.GrandsID 
INNER JOIN KeyWords ON GrantsKeyConn.KeyWordsID = KeyWords.ID 
WHERE 
--Filter here 
ORDER BY 
--Order here 

如果您需要更多的幫助,讓我知道。 這將返回所有鏈接,但由於它看起來像一個很大的表,只是查詢您實際使用的列。

另外,如果你想知道如何從C#查詢數據庫,那麼你有很多選擇。 您可能會感興趣this有用。

2

你可能想要做這樣的事情

select * from grants g, grantsKeyConn gKC where g.id = gKC.grantsId and gKC.KeyWordsID in (select id from KeyWords where KeyWord in ('new','final','test');

這樣做的問題是,如果你正在尋找的是有多個按鍵授予你會得到多個結果。你可以將它增強成類似於...

select DISTINCT(g.id) from .... 

然後將其傳遞給另一個調用。

另一種選擇是使用類似休眠的東西,並讓它爲你映射所有東西。

+1

這不是他要求的,他要求加入,這是一個子查詢,因此也比較慢。 – Aidiakapi 2011-03-15 15:48:03

+0

@CtrlDot ...授予g'和'grantsKeyConn gKC'的語法是什麼意思? – Hristo 2011-03-15 17:57:11

+0

@Aidiakapi您實際上必須分析數據庫服務器所採用的路徑。你不能只是做一個空白的聲明,說一個子查詢比較慢。實際執行查詢之前,內部聯接對整個表執行大量操作。 – CtrlDot 2011-03-15 19:28:40