Mysql 您尝试过这个查询吗?其次,没有“缺少”值。将最低值(0)指定给字母表中的第一个名称。若原始表的某些行中的name是null,那个么使用我在上面添加的第三个sql。最后,如果这解决了您的问题,请将其标记为已接受的答案。谢谢谢谢你的建议。这些数字不必是连续的。

Mysql 您尝试过这个查询吗?其次,没有“缺少”值。将最低值(0)指定给字母表中的第一个名称。若原始表的某些行中的name是null,那个么使用我在上面添加的第三个sql。最后,如果这解决了您的问题,请将其标记为已接受的答案。谢谢谢谢你的建议。这些数字不必是连续的。,mysql,sql,Mysql,Sql,您尝试过这个查询吗?其次,没有“缺少”值。将最低值(0)指定给字母表中的第一个名称。若原始表的某些行中的name是null,那个么使用我在上面添加的第三个sql。最后,如果这解决了您的问题,请将其标记为已接受的答案。谢谢谢谢你的建议。这些数字不必是连续的。三者中哪一个最快?我的桌子大约有20万行。@Amenhotep。我想从第一个开始,不过如果你在(name)上有索引,最后一个可能是最快的。谢谢你的建议。这些数字不必是连续的。三者中哪一个最快?我的桌子大约有20万行。@Amenhotep。我将从


您尝试过这个查询吗?其次,没有“缺少”值。将最低值(0)指定给字母表中的第一个名称。若原始表的某些行中的name是
null
,那个么使用我在上面添加的第三个sql。最后,如果这解决了您的问题,请将其标记为已接受的答案。谢谢谢谢你的建议。这些数字不必是连续的。三者中哪一个最快?我的桌子大约有20万行。@Amenhotep。我想从第一个开始,不过如果你在
(name)
上有索引,最后一个可能是最快的。谢谢你的建议。这些数字不必是连续的。三者中哪一个最快?我的桌子大约有20万行。@Amenhotep。我将从第一个开始,尽管如果您在
(name)
上有索引,那么最后一个可能是最快的。对于200k条记录,您最好加入一个表视图,为每个人分配唯一的组,而不是执行200k条内联select语句。您反对这里的联接有什么特别的原因吗?不,不,我不反对联接,我只是想知道是否存在一种更智能/更快/更整洁的方式。对于200k记录,您最好加入一个表视图,为每个人分配唯一的组,而不是执行200k内联select语句。有什么特别的原因反对加入吗?不,不,我不反对加入,我只是想知道是否有更聪明/更快/更整洁的方法。
id   name
0     Bob
1   Alice
2     Bob
3   
4     Bob
5    Mary
6   Alice
id   name   group_id
0     Bob          0  -- Bob's group
1   Alice          1  -- Alice's group
2     Bob          0  -- Bob's group
3                     -- no group (NULL)
4     Bob          0  -- Bob's group
5    Mary          2  -- Mary's group
6   Alice          1  -- Alice's group
select t.*, minid as group_id
from t join
     (select name, min(id) as minid
      from t
      group by name
     ) tt
     on not t.name <=> tt.name;  -- to handle `NULL`
select t.*, minid as group_id
from t join
     (select name, min(id) as minid, (@grp := @grp + 1) as group_id
      from t cross join
           (select @grp := -1) params
      group by name
     ) tt
     on not t.name <=> tt.name;  -- to handle `NULL`;
select t.*
from (select t.*,
             (@grp := if(not @n <=> name, @grp,
                         if(@n := name, 1, 1)
                        )
             ) as group_id
      from t
           (select @grp := -1, @n := '') params
      order by name
     ) t
order by id;
Select id, name, 
   case name
      when 'Bob' then 0 
      when 'Alice' then 1 
      when 'Mary' then 2 
      -- etc.
      end GroupId
From table 
Select id, name,
  (select count(distinct name) 
   from table 
   where name < t.Name) groupId
From table t
Select id, name,
  case when name is null then null 
    else (select count(distinct name) 
          from table 
          where name < t.Name) end groupId
From table t