Php SQL select正在尝试合并和筛选结果
我正在使用PHP脚本和MySQL从表中显示一些值,但我真的被卡住了,我在网上搜索过,但我不能真正表达我的问题 我的桌子看起来像: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使用了
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,包含此标记的
为100ArticleID
- 对于标签:1、2和3,包含此标签的
为100ArticleID
- 对于标记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,我假设我们知道标记的计数:
在这里,我们必须检索1,2,3中的标签。我们知道标签的数量是3。由于没有两行具有相同的标记和ArticleId,因此我们执行以下操作。我们获取一个包含任何标记1、2、3的行列表。我们得到:SELECT ArticleId FROM Tags WHERE Tag IN (1,2,3) GROUP BY ArticleId HAVING COUNT(Tag) = 3
然后我们根据Tag ArticleId 1 100 1 200 2 90 2 100 3 100
对它们进行分组,并计算ArticleId
标签的数量。如果是3,那么只有我们检索到
编辑:(基于@SteveG的评论) 如果两行或更多行的Tag和ArticleId相同,那么我们可以使用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,您的输入标签是什么?这是一个很好的尝试,但是如果标签和文章不是唯一的,它将不会始终起作用。。也许让它
?@StevieG Ya,我假设:拥有COUNT(distinct Tag)=3
,因为没有两行的Tag和ArticleId相同,我认为情况就是这样。否则,这些行只有
不同。@StevieG用新信息编辑了答案。我不知道我能在Id
中放入计数
+1对于注释,它应该是。只要你把标签放在不同的
数组中。实际上,Jomoos的答案更简洁,因为它不使用子查询来实现同样的功能。推荐使用他的。谁记下我的名字,你能解释一下为什么这是错误的吗?从错误中学习总是好的!谢谢$tags\u to\u check