Mysql两个子集的交集

时间:2013-05-28 13:19:14

标签: mysql intersection subset

我想知道是否有人可以帮助我解决我遇到的问题。 :) 我有一个包含文章的表,名为article,我还有一个表commonarticletechnique,我保存了记者可以用来撰写文章的所有技巧。我还有一个表articletechnique,我在文章和常用文章技术之间有参考。对不起我的英语,我不是母语为英语的人。所以我的情况看起来像:

ArticleIdMany other fields...

CommonArticleTechniqueIdNameDescription

ArticleTechniqueIdFkArticleIdFkCommonArticleTechnique

例如,我可以在表格中使用以下内容:

  • article中,文章ID为282;
  • in commonarticletechnique用户撰写文章时使用的各种技术;
  • in articletechnique我可以

1,282,12

2,282,13

3,282,14

所以,有了这些记录,我可以说id为282的文章有3种概念技术。

在UI中我有一个部分,用户可以在我的数据库中搜索,他们可以检查没有,一个,更多的文章技术。因此,如果我想找到一篇基于技术12,13,14的文章,我必须编写一个mysql查询来获取与我的技术匹配exactly的所有文章。

在我的例子中,如果用户选择12,13种技术,mysql不应该返回文章282。 在这种情况下,上升的问题受两个mysql子集的交集限制。 其中一个来自从表中提取的集合,另一个来自UI,来自用户的选择。

请告诉我是否知道如何编写mysql查询,并且非常有助于不实现存储过程。

谢谢大家, Aryliah。

1 个答案:

答案 0 :(得分:0)

我认为同一篇文章中不能有两个条目使用相同的技术(例如两次282,12)。这也意味着你不需要需要你的articletechnique表中的Id PK。

反正。

您的查询应该是这样的:

SELECT t1.FkArticleId
FROM ArticleTechnique t1
WHERE t1.fkArticleId IN (SELECT t2.FkArticleId
                         FROM ArticleTechnique t2
                         WHERE t2.FkCommonArticleTechnique IN (12, 13))
GROUP BY t1.FkArticleId
HAVING COUNT(*) = 2;

当然,x中的HAVING COUNT(*) = x必须等于所选技术的数量(12,13在这种情况下是...... 2种技术)