php - MySql Tag System - How to select just one Tag for each Id, without repeating the same Tag?
I'm implementing a Tag system using PHP and MySql.
In my Tags table there are two columns (Id and Tag). Each Id may have one or more tag(s) associated to it - like this:
| Id | Tag |
|---|---|
| 1 | red |
| 1 | blue |
| 1 | orange |
| 2 | green |
| 3 | black |
| 4 | grey |
| 5 | grey |
| 6 | pink |
| 7 | white |
| 7 | purple |
| 8 | blue |
| 9 | yellow |
| 9 | cyan |
Answer
Solution:
Use NOT EXISTS to filter out duplicate tags and aggregate:
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
Instead of MAX() you could use MIN() or .
See the demo.
Answer
Solution:
Create a temp table with unique constraint and do 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;
Source