我正在使用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;