我有以下记录集(is_unique为空):
+-----+----------+-------------+
| id | is_unique| val |
+-----+----------+-------------+
| 1 | 1 | 100100 |
| 2 | 1 | 222111 |
| 3 | 0 | 100100 |
| 4 | 0 | 222111 |
| 5 | 1 | 311111 |
+-----+----------+-------------+
如何为val中值的每个第一次出现(关于id)设置is_unique = true?
答案 0 :(得分:0)
这实际上并不难实现。您需要做的是在select语句中有一个subselect来检查表中是否有任何其他条目具有相同的值和较小的id。如果存在这样的条目,我们要将is_unique设置为0.否则,is_unique应设置为1.
Select Coalesce((
Select top 1 0
From tabletest t2
Where t2.val = t1.val
and t2.id<t1.id), 1) as is_unique
From tabletest t1
Coalesce是mysql中的一个关键字,用于检查第一个值是否为null。如果该值不为null,则coalesce将使用该值。如果该值为null,则将使用第二个输入值。因此,如果表中的条目id比当前行小,则子查询将拉回0并且coalesce将该0传递给select。如果当前记录具有该记录的最小id,则子选择将为null,并且coalesce将1返回到select。
答案 1 :(得分:0)
使用用户变量: -
SET @prev:=0;
UPDATE someTable
SET is_unique=IF(@prev=val, 0, IF(@prev:=val, 1, 0 ))
ORDER BY val, id;
这会将用户变量设置为0(我假设val是一个整数字段)。然后更新,按val和id排序。如果@prev与val相同则将is_unique设置为0,否则将其设置为检查val的当前值分配给@prev的结果。
SQL小提琴: -