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