MySql标签系统-如何为每个Id只选择一个标签,而不重复相同的标签



我正在使用PHP和MySql实现一个Tag系统。

在我的Tags表中有两列(Id和Tag(。每个Id可能有一个或多个与其相关联的标签,如下所示:

Id 标签
1 红色
1 蓝色
1 橙色
2 绿色
3 黑色
4 灰色
5 灰色
6 粉红色
7 白色
7 紫色
8 蓝色
9 黄色
9 青色

使用NOT EXISTS过滤掉重复的标签并聚合:

SELECT t1.Id, MAX(t1.Tag) Tag  
FROM Tags t1 
WHERE NOT EXISTS (
SELECT 1
FROM Tags t2
WHERE t2.Id > t1.Id AND t2.Tag = t1.Tag
)
GROUP BY t1.Id
ORDER BY t1.Id DESC

您可以使用MIN()ANY_VALUE()来代替MAX()

请参阅演示

创建一个具有唯一约束的临时表并执行insert ignore。

DROP Temporary table IF exists T_Test;
create Temporary table T_Test(id INTEGER UNIQUE, tag VARCHAR(10) UNIQUE);
insert IGNORE into T_Test
SELECT * FROM Tags
ORDER BY id DESC,  tag DESC;
SELECT * from T_Test;

最新更新