2013-04-27 94 views
2

我試圖展示一個用戶列表,其中activated=1的帳戶列表在下面,而activated=0帳戶在上面。我嘗試使用UNION,因爲我需要所有非活動帳戶爲ORDER BY created DESC,而激活帳戶設置爲ORDER BY email,但由於某些原因,我的所有ORDER BY命令都被忽略。我在這裏做錯了什麼?MySQL在使用UNION時使用ORDER BY

(
    SELECT 
     email, 
     roles.full role, 
     created 
    FROM sol_users users 
    JOIN sol_user_roles ur ON users.id = ur.user_id 
    JOIN sol_roles roles USING(role_id) 
    WHERE activated = 0 
    ORDER BY created DESC 
) 
UNION 
(
    SELECT 
     email, 
     roles.full role, 
     created 
    FROM sol_users users 
    JOIN sol_user_roles ur ON users.id = ur.user_id 
    JOIN sol_roles roles USING(role_id) 
    WHERE activated = 1 
    ORDER BY email 
) 

非活動用戶需要置於頂部,以便管理員知道這些需要激活。

回答

2

你不需要一個聯盟 - 嘗試:

SELECT email, roles.full role, created 
FROM sol_users users 
JOIN sol_user_roles ur ON users.id = ur.user_id 
JOIN sol_roles roles USING(role_id) 
ORDER BY activated, case activated when 1 then email end, created DESC 
+0

哇。我從來不知道你可以使用'ORDER BY'的條件。這樣美麗的代碼! – enchance 2013-04-27 10:36:51

+0

很高興你喜歡。 :) – 2013-04-27 10:45:23

0

你可以嘗試在ORDER BY子句中使用的IF聲明。有關類似主題的討論,請參閱this