C# (SQL)选择一行,该行具有2+个与其关联的特定值

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 --------|------

假设我有三张桌子。例如,一个表TblArticles描述了文章。它有一个自动递增键、项目名称和其他相关数据,例如:

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有关,但我找到并编辑到帖子中的解决方案对我起作用。