我使用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;