Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 多对多标记条件选择_Mysql - Fatal编程技术网

Mysql 多对多标记条件选择

Mysql 多对多标记条件选择,mysql,Mysql,我有三个MySQL表——文档、文档标记和多对多关系表(带有文档ID和标记ID) 例如,需要获取带有2个(或更多)具有特定值的标记的文档。我们使用以下联接查询: 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 DocumentT

我有三个MySQL表——文档、文档标记和多对多关系表(带有文档ID和标记ID)

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

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'
在这种情况下,我们需要在条件中添加尽可能多的连接和标记。因此,它们应该由一些脚本动态创建。有没有更优雅的处理方法?

试试这个:

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
试试这个:

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
你可以找这个

   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')
你可以找这个

   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')

+1 where子句有效地将外部联接转换为内部联接。@哈姆雷特·哈科比扬非常感谢您的快速响应+1 where子句将外部连接有效地转换为内部连接。@哈姆雷特·哈科比扬非常感谢您的快速响应!