2013-06-26 67 views
2

我有一張表,其中包含用戶列表以及他們被允許訪問的應用程序。此表中的每行都有一列user_id和app_id以及其他一些內容,並且存在這樣的行足以讓每個用戶都能夠訪問該應用程序。子查詢在mysql中返回多個行錯誤

我有一些用戶可以訪問某個特定的應用程序,但我希望看到哪些用戶無法訪問特定的應用程序,並通過爲每個此類用戶在表中創建行來授予他們對此應用程序的訪問權限。

這將是這樣的:

SET @v1 := (SELECT user_id from user_app_map WHERE app_id != <app_id_here>); 

INSERT INTO user_app_map (user_id, app_id) VALUES (
    (SELECT @v1), <app_id_here>); 

當我執行上面的查詢,我得到#1242 - Subquery returns more than 1 row錯誤。

我在Google上搜索了這個錯誤,但是我得到的結果有一些比這個更復雜的問題,所以我不明白我想從中得到什麼。

請告訴我怎麼做這樣的手術?

在此先感謝!

更新:我可以做這樣說:

INSERT INTO user_app_map (user_id, app_id) 
    SELECT user_id, <app_id_here> from user_app_map WHERE app_id != <app_id_here> 

但這種方法不會在這種情況下工作,因爲有些用戶誰有權訪問多個應用程序,必須在表中的許多行與他們的ID 。如果我如上所述查詢,我​​會再次給同一個人訪問同一個應用程序。

示例:用戶3可以同時訪問應用3和應用4,這意味着user_app_map包含兩行,分別是user_id 3和app_id 3和4。通過上面的查詢,我從第二行獲取user_id,並再次創建另一行,這將成爲第一行不必要的重複。

回答

2

您可以在一個僅值賦值給一個變量,因此,如果該查詢:

SELECT user_id from user_app_map WHERE app_id != <app_id_here> 

返回多行(極有可能的,除非你只需要在你的表兩行),你會得到多於一行,因此你的例外。

爲了解決這個問題,無論是可能使用聚合函數確保只有一行:

SET @v1 := (SELECT max(user_id) from user_app_map WHERE app_id != <app_id_here>); 

或WHERE子句中通過更緊密的縮小行之一。


如果你的目的是要進行所有值插入,試試這個:

INSERT INTO user_app_map (user_id, app_id) 
SELECT DISTINCT user_id, <app_id_here> from user_app_map WHERE app_id != <app_id_here> 
+0

是的,它確實返回多行。如何在不使用變量的情況下做同樣的事情? –

+0

@ForbiddenOverseer請參閱編輯aswer – Bohemian

+0

最後一個查詢似乎有問題... VALUES後面的圓括號應該結束? –

2

您在只有一個單值預期的地方使用子查詢 - 因此這個錯誤。

但是,這可以很容易地使用INSERT ... SELECT語法來完成,像這樣:

INSERT INTO user_app_map (user_id, app_id) 
    SELECT user_id, <app_id_here> from user_app_map WHERE app_id != <app_id_here> 

的選擇將選擇從動態的相關記錄的USER_ID,第二個「列」返回只是一個靜態值。

+0

哇...似乎這個只是解決了我的問題!我想過寫這個查詢,但是每次INSERT完成後SELECT語句都不工作?或者它選擇所有記錄一次,然後將它們插入到表中?謝謝您的幫助!等待答覆。 :) –

+0

查看鏈接的手冊頁,它說:_「當同時從表中選擇並插入表時,MySQL創建一個臨時表來保存來自SELECT的行,然後將這些行插入到目標表中。」 _ – CBroe

+0

由於某些原因,某些用戶尚未獲得應用程序訪問權限。在哪裏app_id!= 包含app_id設置爲NULL的? –