根据字符串对记录进行排序



请考虑下表

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)上建立索引。

相关内容

  • 没有找到相关文章

最新更新