MySQL在第一次出现另一个字段中的值时设置Flag

时间:2014-07-02 16:03:30

标签: mysql sql

我有以下记录集(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?

2 个答案:

答案 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小提琴: -

http://www.sqlfiddle.com/#!2/6f9d50/1