2016-05-30 4 views
0

を選択し、それぞれから1つのレコードの順に選択マージが誰かに属している:の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つのレコードを作成し、最後に別のレコードを作成するクエリは作成してもらえますか?

答えて

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のアプローチは、自己参加し、あなたが前に来るの行数をカウントすることにより、行のランキングの位置を決定することができますグループですそれ。これはおそらく遅いので、私は独自の方法からあなたに話すことができるのではないかと疑いますが、私はあなたに代案を与えるために言います。 datausernameを例に改善し、その後、所望のパターンを持っていない場合は

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`; 

で動作します。

関連する問題