Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL select正在尝试合并和筛选结果_Php_Mysql_Sql - Fatal编程技术网

Php SQL select正在尝试合并和筛选结果

Php SQL select正在尝试合并和筛选结果,php,mysql,sql,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语句,它将显示哪些ArticleIDs使用了

我正在使用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
s使用了标记

例如:

  • 对于标记:1和2,包含此标记的
    ArticleID
    为100
  • 对于标签:1、2和3,包含此标签的
    ArticleID
    为100
  • 对于标记1和5,没有包含这些标记的文章
有什么帮助吗

还有什么方法可以与上面的陈述进行组合

例如:

  • 对于标签:1、3、6和5,没有包含这些标签的文章
  • 但是对于标签1和3,包含此标签的文章ID是100
  • 对于标签:5和6,包含此标签的物品ID为90等
      未经测试,但我认为这正是您想要的

       SELECT t.ArticleID
       FROM Tags t
       JOIN Tags t2
            ON t2.ArticleID = t.ArticleID
            AND t2.Tag = 2
       WHERE t.Tag = 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,我假设我们知道标记的计数:

      SELECT  ArticleId 
          FROM Tags 
          WHERE Tag IN (1,2,3) 
          GROUP BY ArticleId 
              HAVING COUNT(Tag) = 3
      
      在这里,我们必须检索1,2,3中的标签。我们知道标签的数量是3。由于没有两行具有相同的标记和ArticleId,因此我们执行以下操作。我们获取一个包含任何标记1、2、3的行列表。我们得到:

      Tag ArticleId
       1   100
       1   200
       2   90
       2   100
       3   100
      
      然后我们根据
      ArticleId
      对它们进行分组,并计算
      标签的数量。如果是3,那么只有我们检索到
      ArticleId

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

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

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

      听起来你想要除法的关系代数运算。请看:它不是MySQL内置的,但它是可以做到的,尽管这有点痛苦。我曾想过使用关系代数,但似乎太麻烦了。另一种处理方法是通过PHP:1)在array1中为tag1存储值执行选择2)在array2中为tag2存储值执行选择。。然后比较数组中的值并接受匹配项,但是这个解决方案似乎是一个非常“草率”的快速问题,您无法传递要查找的标记和要匹配的文章id?您只想传递标签并获取信息..亲爱的Andres,我正在尝试查找哪些文章包含所有输入标签SSO,您的输入标签是什么?这是一个很好的尝试,但是如果标签和文章不是唯一的,它将不会始终起作用。。也许让它
      拥有COUNT(distinct Tag)=3
      ?@StevieG Ya,我假设:
      ,因为没有两行的Tag和ArticleId相同,我认为情况就是这样。否则,这些行只有
      Id
      不同。@StevieG用新信息编辑了答案。我不知道我能在
      计数
      中放入
      不同的
      +1对于注释,它应该是。只要你把标签放在
      $tags\u to\u check
      数组中。实际上,Jomoos的答案更简洁,因为它不使用子查询来实现同样的功能。推荐使用他的。谁记下我的名字,你能解释一下为什么这是错误的吗?从错误中学习总是好的!谢谢