MySQL查询以检索在多对多关系中具有完全匹配的项目

时间:2012-11-06 15:07:21

标签: mysql sql join

我有以下表格:

Media:
- mediaid
- mediatitle


MediaTag:
- mediaid
- mediatag


Tag:
- tagid
- tagname

以下标记:

Tag: (1) - Public
Tag: (2) - Premium
Tag: (3) - Restricted

以下带有标签的媒体:

Media: (1) - Public
Media: (2) - Premium & Restricted
Media: (3) - Premium
Media: (4) - Restricted
Media: (5) - No tags

假设用户有权仅查看Public (1)Restricted (3)标记。如果媒体具有用户没有明确访问权限的标签组合,则不允许他看到它。如果媒体没有标签,则根本看不到。因此,在这种情况下,用户只能看到Media 1Media 4

是否可以编写MySQL查询来检索媒体,假设我拥有标记为(1,3)的数组形式的用户权限?

1 个答案:

答案 0 :(得分:2)

JOIN三个表,并将包含用户有权访问它们的标记ID的数组传递给IN子句中的WHERE谓词。

例如对于数组[1, 3],您可以这样做:

SELECT m.mediatitle, t.tagname
FROM media m
INNER JOIN MediaTag mt ON m.mediaid = mt.mediaid
INNER JOIN Tag t ON mt.mediatag = t.tagid
WHERE t.id IN (1, 3);

更新:要仅获取同时包含标记ID(1,3)的mediatitle,请使用GROUP BY mediatitle HAVING COUNT(tagname) = 2,如此:

SELECT m.mediatitle
FROM media m
INNER JOIN mediaTag mt ON m.mediaid = mt.mediaid
INNER JOIN tag t ON mt.mediatag = t.tagid
WHERE t.tagid IN (1, 3)
GROUP BY m.mediatitle
HAVING COUNT(t.tagname) = 2;

SQL Fiddle Demo