请考虑下表
Id F1 F2
---------------------------
1 Nima a
2 Eli a
3 Arian a
4 Ava b
5 Arsha b
6 Rozhan c
7 Zhina c
我想通过排序COLUMN F2
来显示记录,以按顺序显示每个字符串类别(a,b,c)中的一条记录
Id F1 F2
---------------------------
1 Nima a
5 Arsha b
6 Rozhan c
2 Eli a
4 Ava b
7 Zhina c
3 Arian a
注意a,b,c可以是任何东西…它应该从一个条目中获取一条记录,然后从第二个条目中获取第二条记录。
我使用了join, or group by records,但是没有成功。
MySQL version 5.7 - Syed Saqlain
SELECT id, f1, f2
FROM ( SELECT t1.id, t1.f1, t1.f2, COUNT(*) cnt
FROM test t1
JOIN test t2 ON t1.f2 = t2.f2 AND t1.id >= t2.id
GROUP BY t1.id, t1.f1, t1.f2 ) t3
ORDER BY cnt, f2;
https://dbfiddle.uk/?rdbms=mysql_5.7&小提琴= 8138 bd9ab5be36ba534a258d20b2e555
ROW_NUMBER()对于低版本MYSQL的替代。此查询将适用于版本5.5,5.6 &5.7 .
-- MySQL (v5.7)
SELECT t.id, t.f1, t.f2
FROM (SELECT @row_no:=CASE WHEN @db_names=d.f2 THEN @row_no+1 ELSE 1 END AS row_number
, @db_names:= d.f2
, d.f2
, d.f1
, d.id
FROM test d,
(SELECT @row_no := 0,@db_names:='') x
ORDER BY d.f2) t
ORDER BY t.row_number, t.f2
请从url https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=02dbb0086a6dd7c926d55a690bffbd06查看
您可以在order by
中使用窗口函数:
select t.*
from t
order by row_number() over (partition by f2 order by id),
f2;
row_number()
函数(如上所述)为f2
的每个值分配一个以1
开头的序号。
在旧版本的MySQL中,你可以使用相关子查询:
order by (select count(*) from t t2 where t2.f2 = t.f2 and t2.id <= t.id),
f2;
为了提高性能,您需要在(f2, id)
上建立索引。