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

时间:2011-12-09 15:30:01

标签: php mysql sql

我正在使用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
  • 对于标签:1,2和3包含此标签的ArticleID为100
  • 对于标签1和5没有包含这些标签的文章

任何帮助?

还有什么方法可以与上述声明组合?

示例:

  • 对于标签:1,3,6和5没有包含这些标签的文章
  • 但是对于标签:1和3包含此标签的文章ID是100,
  • 对于标签:5和6包含此标签的文章ID是90等。

3 个答案:

答案 0 :(得分:2)

我认为以下查询将完成这项工作:

例如,要检查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

编辑:(基于@SteveG的评论)

如果两行或多行的Tag和ArticleId相同,那么我们可以使用DISTINCT来克服这一点。

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

答案 1 :(得分:1)

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

<?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,我们知道该文章包含所有请求的标签。

答案 2 :(得分:-1)

未经测试,但我认为这就是你要找的东西?

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