我正在使用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
已经使用了标签
示例:
ArticleID
为100 ArticleID
为100 任何帮助?
还有什么方法可以与上述声明组合?
示例:
答案 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;