SQL选择尝试组合和过滤结果


SQL select trying to combine and filter the results

我使用PHP脚本和MySQL从表中显示一些值,但我真的卡住了,我在网上搜索过,但我不能真正表达我的问题

我的表看起来像:

Table : Tags
Id  Tag  ArticleID
1    1    100
2    1    200
3    2    90
4    2    100
5    3    100
6    5    90
7    6    90
8    10   100

Id列是主键。

所以我想创建一个Select语句它将显示哪些ArticleID使用了

标签

的例子:

  • 标签:1和2包含此标签的ArticleID为100
  • For Tags: 1,2,3包含此标签的ArticleID为100
  • 标签1和5没有包含这些标签的文章

帮忙吗?

还有什么方法可以与上面的语句组合吗?

的例子:

  • 标签:1,3,6和5没有包含这些标签的文章
  • BUT For Tags: 1和3包含此标签的文章ID为100,
  • For Tags: 5和6包含此标签的文章ID为90等。

我认为下面的查询可以完成工作:

例如,要检查1,2,3,我假设我们知道标签的数量:

SELECT  ArticleId 
    FROM Tags 
    WHERE Tag IN (1,2,3) 
    GROUP BY ArticleId 
        HAVING COUNT(Tag) = 3

在这里,我们必须检索1,2,3中的标签。我们知道标签的数量是3。由于没有两行具有相同的Tag和ArticleId,因此我们执行以下操作。我们取一个包含标签1 2 3的行列表。我们得到:

Tag ArticleId
 1   100
 1   200
 2   90
 2   100
 3   100

然后根据ArticleId进行分组,并对Tag进行计数。如果是3,那么我们只检索ArticleId

EDIT:(基于@SteveG的评论)

如果Tag和ArticleId在两行或两行以上是相同的,那么我们可以使用DISTINCT来克服这个问题。

SELECT  ArticleId 
    FROM Tags 
    WHERE Tag IN (1,2,3) 
    GROUP BY ArticleId 
        HAVING COUNT(DISTINCT Tag) = 3

这是一个可怕的hack,但这是我能想到的:

<?php
$tags_to_check = array(1,2,3);
mysql_query(
  'select distinct t1.articleid from tags t1 where (
     select count(distinct(tag)) from tags t2 where
       t2.articleid = t1.articleid and
       t2.tag in '. implode(',', $tags_to_check) .')
   )='. count($tags_to_check);
?>

对于每篇文章,我计算给定集合(1,2,3)中有多少唯一标签,如果该数字为3,我们知道该文章包含所有请求的标签。

未经测试,但我认为这是你在寻找什么?

 SELECT t.ArticleID
 FROM Tags t
 JOIN Tags t2
      ON t2.ArticleID = t.ArticleID
      AND t2.Tag = 2
 WHERE t.Tag = 1;