2016-12-14 211 views
4

我有一个像下面这样的表,用于保存用户记录。我想列出权限字段为0的用户,然后是权限为1的用户。但是,我也想按字母顺序排列它们。我如何排序两个SELECT查询并将它们组合

这是我的表:

users 
-------------------------------- 
user_id  name  permission 
1   jack  0 
2   anne  0 
3   kate  0 
4   steve  1 
5   roger  0 
6   judy  1 
7   robin  0 
8   stella 1 
9   arthur 0 

而且我想要得到这样的结果:

users 
--------------------------------- 
user_id  name  permission 
2    anne  0 
9    arthur  0 
1    jack  0 
3    kate  0 
7    robin  0 
5    roger  0 
6    judy  1 
8    stella  1 
4    steve  1 

正如你可以看到,有两组,先用权限的用户“0”和稍后的权限“1”。但每个组也按字母顺序排序。

(
SELECT * 
FROM `users` 
ORDER BY name ASC 
) 
UNION (

SELECT * 
FROM `users` 
ORDER BY name ASC 
) 
ORDER BY permission ASC 

我试图通过排序和组合它们来分别得到两个组,但它不是按我想要的方式工作。

+0

你实际得到了什么结果? – Takarii

+0

'users'和'name'是两个不同的表吗? – Viki888

回答

6

象下面这样的代码工作

SELECT * 
FROM `users` 
ORDER BY permission ASC , username ASC 

你应该写你想要的列的名称最初由第一顺序,那么第二,第三等

1

您可以按两个字段排序。不需要做任何事情。

SELECT 
* 
FROM yourtable 
ORDER BY name ASC, 
     permission ASC 
+0

什么是“NY”。它给出了一个错误? – amone

+0

这是一个错字。它应该是“按顺序”。 –

+0

对不起,错过了编辑@ 1000111 –

5
SELECT 
* 
FROM users 
ORDER BY 
     permission ASC, 
     name ASC; 

您不需要两个单独的查询

首先结果集按升序排序(从低到高) igher)根据permission列的值。

现在您有一个排序列表,其中所有具有0permission的记录将首先出现。

接下来,如果你name列适用另一类这个排序列表上,则它将使一个字母排序的列表,其中前面的排序顺序也同样适用,因为这一个。


测试:

create table users(
    id int primary key AUTO_INCREMENT, 
    name varchar(50), 
    permission int 
); 

INSERT INTO users(name,permission) 
VALUES ('A',1),('D',0),('C',0),('B',1); 

SELECT * FROM users; 

id  name permission 

1  A  1 
2  D  0 
3  C  0 
4  B  1 

#Sort only by permission (ASC) 

SELECT * FROM users ORDER BY permission ASC; 

id  name permission 

2  D  0 
3  C  0 
1  A  1 
4  B  1 

#Sort first by permission (ASC), then by name (ASC) 

SELECT * FROM users ORDER BY permission ASC, name ASC; 

id  name permission 

3  C  0 
2  D  0 
1  A  1 
4  B  1 

SEE DEMO