2017-06-20 125 views
0

我目前正在与SQL玩弄,并试图找到实现这一目标的最佳方式设置一列值只有一个用户:根据结果

我现在有,有一个user_id的用户表,organisation_id, registered_datetime。本表中有不同组织的 许多用户。有可能是在 1个组织3个不同的用户,或在1个组织1等

我添加了一个新列名为admin_user,我想串起来的SQL语句一起 更新管理员用户列。每个组织只能有一个管理员用户,并且我希望 最早为该组织注册的用户是管理员。

我可以手动执行此操作,但如果我有很多用户,则需要时间。什么是最好的 方式来实现这一目标?

编辑:

enter image description here

所以我有许多用户喜欢这个与列。突出显示的是最早注册的用户。我希望能够将这些用户设置为管理员用户。管理员组织中唯一的管理员用户,并将剩下的设置为0. 1(管理员)0(非管理员)

+0

请提供(1)样品的数据; (2)您正在使用的数据库的标签。 –

+0

请阅读http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557和接受的答案 –

回答

1

此SQL查询将标记为users,其registered_datetime作为管理员在其organisation_id中是最低的。

UPDATE users SET admin_user = 1 
WHERE user_id IN (
    SELECT u.user_id FROM users u 
    WHERE u.registered_datetime IS NOT NULL AND NOT EXISTS(
     SELECT 1 FROM users iu 
     WHERE iu.organisation_id = u.organisation_id AND iu.registered_datetime < u.registered_datetime 
    ) 
) 

您可能希望此代码之前更新所有用户admin_user = 0,让所有的用户都会有自己的值设置。

这里需要注意的是,如果一个组织中的两个用户在完全相同的时间注册,那么他们都将被标记为管理员。

我已经加入到u.registered_datetime IS NOT NULL WHERE子句更新到registered_datetime过滤掉用户NULL

MSSQL

在MSSQL服务器我通常解决这个问题以另一种方式,通过使用ROW_NUMBER()

WITH base AS (
    SELECT user_id, ROW_NUMBER() OVER (PARTITION BY organisation_id ORDER BY registered_datetime ASC) AS rn 
    FROM user 
    WHERE registered_datetime IS NOT NULL 
) 
UPDATE user SET is_admin = 1 
WHERE user_id IN (
    SELECT base.user_id FROM base WHERE rn = 1 
) 
+0

我意识到我似乎在'registered_datetime'的一条记录上有'NULL'值,当我运行查询时,它也将该用户设置为管理员,即使组织中已有管理员。这只是它没有考虑到零的事实。我添加了'AND iu.registered_datetime不是NULL,u.registered_datetime不是NULL',但它仍在更新该记录。是否可以更改该语句以考虑该列中可能的NULL值? –

0

这太长了评论。

你所描述三个不同的表:

  • Users
  • Organizations
  • UserOrganizations

最后一个是每个用户和每个组织一行。这提供了两者之间的映射。这可以称为“映射”表,“联结”表或“关联”表。

如何为每个组织实施一个管理员取决于您使用的数据库。

0

您不需要admin_user列。你需要一列isadmin。 当用户登记,如果他在组织中的第一,那么isadmin列的值为1,否则为0

此外,您还可以使用AAA查询找到管理员

SELECT `table`.`user_id`, MIN(`table`.`registered_datetime`) WHERE `organisation_id`=... 
+0

我想为每个组织设置一个管理员用户。所以1的值将意味着用户是不是管理员的管理员0。我将如何去更新每个用户的管理值?我需要从每个组织中找到最早注册的用户,然后将该用户设置为管理员用户。 –