2016-05-30 42 views
0

我已经包含了太多的记录,并记录每一束表属于某人:MySQL的合并选择从每一个记录的顺序选择

--------------------- 
id | data | username 
--------------------- 
1 | 10 | ali 
2 | 11 | ali 
3 | 12 | ali 
4 | 20 | omid 
5 | 21 | omid 
6 | 30 | reza 

现在我想创建一个查询导致我像这样:

 
1-10-ali 
4-20-omid 
6-30-reza 
2-11-ali 
5-21-omid 
3-12-ali 

是否有无论如何创建一个查询,导致我每个用户名一个记录,然后一个从另一个,另一个到最后?

回答

1

不幸的是,MySQL没有排名系统,所以你可以使用UDV(用户定义的变量)来排列你的记录。

SELECT id, `data`, name 
FROM 
(SELECT 
    id, `data`, name, 
    @rank := if(@name = name, @rank + 1, 1) as rank, 
    @name := name 
    FROM test 
    CROSS JOIN (SELECT @rank := 1, @name := '') temp 
    ORDER BY name, `data` 
) t 
ORDER BY t.rank, t.name, t.data 

Sql Fiddle to play with

输出:

+---------------------+ 
| id | data | name | 
+-----+------+--------+ 
| 1 | 10 | ali | 
+---------------------+ 
| 4 | 20 | omid | 
+---------------------+ 
| 6 | 30 | reza | 
+---------------------+ 
| 2 | 11 | ali | 
+---------------------+ 
| 5 | 21 | omid | 
+---------------------+ 
| 3 | 12 | ali | 
+---------------------+ 
+0

谢谢!它在小提琴上工作,我会在MySQL上测试它,让你现在结果 – Omid

0

经典的SQL方法是自连接和分组,可以让你通过计算来之前的行数确定行的排名位置它。由于这可能较慢,我怀疑我可以说出你的专有方法,但我提到它给你一个选择。

select t.id, min(t.`data`), min(t.username) 
from test t inner join test t2 
    on t2.username = t.username and t2.id <= t.id 
group by t.id 
order by count(*), min(t.username) 
0

你的榜样将与

SELECT id, `data`, name 
    FROM tbl 
    ORDER BY `data` % 10, 
       username 
       `data`; 

如果datausername工作没有所需的图案,然后改善的例子。