2011-03-15 98 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