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。我將如何去更新每個用戶的管理值?我需要從每個組織中找到最早註冊的用戶,然後將該用戶設置爲管理員用戶。 –