2016-05-30 82 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工作沒有所需的圖案,然後改善的例子。