0

我有以下表格:

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

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

4

1 回答 1

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

更新:例如,要仅获取mediatitle具有两个标签 id (1, 3) 的 s,请使用 a GROUP BY mediatitlewith ,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 小提琴演示

于 2012-11-06T15:10:12.473 回答