首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多对多标签条件选择

多对多标签条件选择
EN

Stack Overflow用户
提问于 2013-04-24 18:14:55
回答 2查看 77关注 0票数 2

我有三个MySQL表- documents、document标签和多对多关系表(带有文档ids和标签ids )。

代码语言:javascript
复制
Document
+------+
|  id  |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+

DocumentToTag
+------+------+
|idDoc |idTag |
+------+------+
|    1 |    1 |
|    1 |    2 |
|    2 |    1 |
|    2 |    3 |
|    4 |    4 |
+------+------+

Tag
+------+-------+
|  id  | value |
+------+-------+
|    1 |     2 |
|    2 |     4 |
|    3 |     8 |
|    4 |    42 |
+------+-------+

有必要获取具有例如2个(或更多)具有特定值的标签的文档。我们使用以下连接查询:

代码语言:javascript
复制
SELECT DISTINCTROW
Document.id

FROM Document
LEFT JOIN DocumentToTag AS dt1 ON dt1.idDoc = Document.id  
LEFT JOIN Tag AS tag1 ON dt1.idTag = tag1.id
LEFT JOIN DocumentToTag AS dt2 ON dt2.idDoc = Document.id
LEFT JOIN Tag AS tag2 ON dt2.idTag = tag2.id

WHERE tag1.value = 'someTagValue'
AND   tag2.value = 'someOtherTagValue'

在这种情况下,我们需要在条件中添加尽可能多的连接和标签。因此它们查询应该由某个脚本动态创建。有没有更优雅的方法来处理它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-24 18:20:35

试试这个:

代码语言:javascript
复制
SELECT
Document.id
FROM Document
    JOIN DocumentToTag AS dt1
        ON dt1.idDoc = Document.id  
    JOIN Tag AS t
        ON dt1.idTag = t.id
WHERE t.value IN ('tag1', 'tag2', 'tag3') -- you can dynamicaly generate this list
GROUP BY Document.id
HAVING COUNT(DISTINCT t.value) = 3 -- you can pass this as parameter
票数 4
EN

Stack Overflow用户

发布于 2013-04-24 18:33:27

你可以看看这个

代码语言:javascript
复制
   SELECT DISTINCT
  Document.id
  FROM Document
 LEFT JOIN DocumentToTag AS dt1 ON dt1.idDoc = Document.id  
 LEFT JOIN Tag AS tag1 ON dt1.idTag = tag1.id

 WHERE tag1.value in ( 'someTagValue' ,'someOtherTagValue')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16189343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档