我有三个MySQL表- documents、document标签和多对多关系表(带有文档ids和标签ids )。
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个(或更多)具有特定值的标签的文档。我们使用以下连接查询:
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'在这种情况下,我们需要在条件中添加尽可能多的连接和标签。因此它们查询应该由某个脚本动态创建。有没有更优雅的方法来处理它?
发布于 2013-04-24 18:20:35
试试这个:
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发布于 2013-04-24 18:33:27
你可以看看这个
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')https://stackoverflow.com/questions/16189343
复制相似问题