C# 列值是另一列的最大值,其中另一个值相同

C# 列值是另一列的最大值,其中另一个值相同,c#,mysql,sql,C#,Mysql,Sql,我需要更新表中的一列。。。让我们称之为MaxUsers,同一用户的不同行数。所以我们有4列: Column 0: Unique ID Column 1: User (Unique User ID, is the same for all subuser) Column 2: SubUser Nr (this is 0 if it is the main user) Column 3: MaxUsers (Maximum Subuser on this User) 我需要第3列(MaxUsers

我需要更新表中的一列。。。让我们称之为
MaxUsers
,同一用户的不同行数。所以我们有4列:

Column 0: Unique ID
Column 1: User (Unique User ID, is the same for all subuser)
Column 2: SubUser Nr (this is 0 if it is the main user)
Column 3: MaxUsers (Maximum Subuser on this User)
我需要第3列(MaxUsers)是第2列(子用户Nr)的最大数量,其中第1行相同(用户)相同

我可以在C#上的Linq中,甚至在python中这样做,但我对SQL有点生疏,在那里做将使用比我认为需要的更多的查询,而且我非常确定我的方法不是最有效的

如果我在C#中这样做,我会这样做,假设SQL数据库在LINQ中是可查询的:

// Grab all main users to an array
var MainUsers = SQLDatabase.Where(x => x.SubUser == 0).toArray();
// Go through them one by one
for(int i = 0;i < MainUsers.length();i++)
{
    // Find all users in this user ID
    var Group = SQLDatabase.Where(x => x.User = MainUsers[i].User).toArray();
    // Go through each subuser
    for(int o = 0; o < Group.Length();o++){
        // If the subuser nr is bigger than the maxusers change it to that
        if(Group[o].SubUserNr > Group[0]MaxUsers){
            Group[0]MaxUsers = Group[o].SubUserNr;
        }
    }
    // Sets the subusers to max value too
    for(int o = 0; o < Group.Length();o++){
       Group[o].MaxUsers = Group[0]MaxUsers
    }
}
SQLDatabase.SaveChanges();
联接两个子查询:

select t1.UID
, t1.User
, t1.[SubUser Nr]
, t2.MaxUsers
from (
    select t.UID
    , t.User
    , t.[SubUser Nr]
    from tbl t
) t1
  inner join (
    select t.UID
    , t.User
    , max(t.[SubUser Nr]) as MaxUsers
    from tbl t
    group by t.UID
    , t.User
) t2 on t2.UID = t1.UID
    and t2.User = t1.User
或者您可以使用相关子查询

select t1.UID
, t1.User
, t1.[SubUser Nr]
, (select max(t2.[SubUser Nr]
   from tbl t2
   where t2.User = t1.User) as MaxUsers

from tbl t1

(很抱歉,我的经验是使用SQL Server。可能需要针对MySQL调整语法。)

我不确定我是否正确理解了您的问题,但我相信最终您希望有一个额外的专栏,告诉您要使用的最新用户记录

            var MainUsers = SQLDatabase.Where(x => x.SubUser == 0);

        foreach (var user in MainUsers)
        {
            user.MaxUsers = MainUsers.Where(x => x.UID == user.UID).Max(x => x.SubUser);
        }
或者您不一定需要有额外的列,而是通过此查询在SQL中选择:

select UID, User, Max(SubUser)
from t1
group by UID, User, SubUser

我认为这应该达到你想要的:

UPDATE Users u
JOIN (SELECT uid, MAX(SubUser) AS max
      FROM Users
      GROUP BY uid) AS t
ON u.uid = t.uid
SET u.MaxUsers = t.max

它应该取每个用户id的最大“subuser”,然后用这些值更新主用户表

这很好,非常感谢,这是最简单的一个,我只是想知道它是否足够快,可以处理几百万行。如果您的最终目标是在数据库的实际列中使用最大值,假设您的表上有适当的索引,那么在数据库端执行该操作总是比在程序上执行该操作要快。Linq速度足够快,尽量不要将其放入数组,因为它需要更多的运行时计算。如Pepper所述,如果您运行的是SQL大小,并且有适当的索引,那么执行查询应该需要1秒的时间。
UPDATE Users u
JOIN (SELECT uid, MAX(SubUser) AS max
      FROM Users
      GROUP BY uid) AS t
ON u.uid = t.uid
SET u.MaxUsers = t.max