C# (SQL)选择一行,该行具有2+个与其关联的特定值
假设我有三张桌子。例如,一个表TblArticles描述了文章。它有一个自动递增键、项目名称和其他相关数据,例如:C# (SQL)选择一行,该行具有2+个与其关联的特定值,c#,sql,sqlite,select,system.data.sqlite,C#,Sql,Sqlite,Select,System.data.sqlite,假设我有三张桌子。例如,一个表TblArticles描述了文章。它有一个自动递增键、项目名称和其他相关数据,例如: pkIndex | sName | Other Data... --------|-------|-------------- 1 | Name1 | Data1 2 | Name2 | Data2 3 | Name3 | Data3 等等。然后我有一个标签表TblTags,例如: pkIndex | sName --------|------
pkIndex | sName | Other Data...
--------|-------|--------------
1 | Name1 | Data1
2 | Name2 | Data2
3 | Name3 | Data3
等等。然后我有一个标签表TblTags,例如:
pkIndex | sName
--------|--------
1 | Politics
2 | Science
3 | Fun
等等。我为它们提供了一个关系表TblArticlesTagsRel,因为一篇文章可以有多个标记,每个标记可以应用于多篇文章:
indArticle | indTag
-----------|-------
1 | 1
1 | 2
2 | 1
2 | 3
3 | 3
等等
所以,我的问题是,从符合特定条件的TblArticles中选择行的最佳方法是什么,比如sName是特定的,并且有几个特定的标记,例如,应用于它们的政治和科学?请注意,为此,我需要为每个选定行显示所有指定的标记,而不是任何一个指定的标记
我知道我可以通过选择前一个select的哪些结果适合另一个标记的条件来实现这一点,但是如果我选择几个标记,select查询会因为这种嵌套而变得越来越复杂,我相信一定会有另一种更简单的方法
我试过以各种方式使用和,但我不知道在这种情况下如何使用它
哦,如果这很重要的话,我正在使用SQLite
编辑:
所以,虽然greyalien007的答案对我不起作用,但它确实为我指明了正确的方向,这就是我最后使用的:
SELECT a.* FROM TblArticles a, (SELECT indArticle FROM TblArticlesTagsRel WHERE indTag IN(1,2) GROUP BY indArticle HAVING COUNT(indArticle)=2) WHERE (a.pkIndex = indArticle) AND (sName = "title");
select * from TblArticles,
(
select indArticle from TblArticlesTagsRel
where indTag IN(1, 2)
group by indArticle
having count(indArticle) = 2
)
where (pkIndex = indArticle)
and (sName = "title");
我不确定SQLite支持什么,但它是否支持tsql之类的派生表 我在这里设置您的数据:
create table TblArticles (pkIndex int, sName varchar(100))
create table TblTags(pkIndex int, sName varchar(100))
create table TblArticlesTagsRel (indArticle int, indTag int)
insert into TblArticles(pkIndex, sName)
values
(1, 'Name1')
, (2, 'Name2')
, (3, 'Name3')
insert into TblTags(pkIndex, sName)
values
(1, 'Science')
, (2, 'Politics')
, (3, 'Fun')
insert into TblArticlesTagsRel(indArticle, indTag)
values
(1, 1)
, (1, 2)
, (2, 1)
, (2, 3)
, (3, 3)
下面是我试图解决的问题:
select a.*
from TblArticles a
inner join (
select indArticle, count(indArticle) as 'tagCount'
from TblArticlesTagsRel r
inner join TblTags t on r.indTag = t.pkIndex
where t.sName in ('Politics', 'Science')
group by indArticle
) d on a.pkIndex = d.indArticle
where sName = 'Name1' and tagCount = 2
未优化,但应完成以下工作:
SELECT * FROM TblArticles WHERE sName="title" AND
EXISTS (
SELECT * FROM TblArticlesTagsRel
JOIN TblTags ON TblTags.pkIndex=TblArticlesTagsRel.indTag
WHERE TblArticlesTagsRel.indArticle=TblArticles.pkIndex AND
TblTags.sName='Politics'
) AND EXISTS (
SELECT * FROM TblArticlesTagsRel
JOIN TblTags ON TblTags.pkIndex=TblArticlesTagsRel.indTag
WHERE TblArticlesTagsRel.indArticle=TblArticles.pkIndex AND
TblTags.sName='Science'
);
所以,虽然greyalien007的答案对我不起作用,但它确实为我指明了正确的方向,这就是我最后使用的:
SELECT a.* FROM TblArticles a, (SELECT indArticle FROM TblArticlesTagsRel WHERE indTag IN(1,2) GROUP BY indArticle HAVING COUNT(indArticle)=2) WHERE (a.pkIndex = indArticle) AND (sName = "title");
select * from TblArticles,
(
select indArticle from TblArticlesTagsRel
where indTag IN(1, 2)
group by indArticle
having count(indArticle) = 2
)
where (pkIndex = indArticle)
and (sName = "title");
隐马尔可夫模型。。。据我所知,这是行不通的。它只会多次返回TblArticles中的所有行。支持似乎不是问题,因为在其他方面没有错误。我想我知道为什么它不起作用。这里的计数并不计算结果中出现的每个id的数量,而是计算结果的数量。因此,它无法判断同一个id是否出现两次,或者我们正在寻找多少个标记。+1@Shooter\uuu Andy tagCount是每个indArticleId的“Politics”和“Science”标记的出现次数。这对我有用!嗯,我不确定为什么它对我不起作用,也许这与它是SQLite有关,但我找到并编辑到帖子中的解决方案对我起作用。