解决方案背后的想法是根据提供者使行从 1 开始编号。如果“a”类型的行从 1..4 开始编号,“b”类型的行从 1..3 开始编号,“c”类型的行从 1..3 开始编号,那么您可以轻松获得你想在这些数字上使用“order by”。
例如,我假设您的表名是“my_table”,它有两个字段,类型和数据。
为了在mysql中生成rownum,我将使用这里描述的:rownum in mysql
现在假设我们要选择所有类型为“a”的行并给它们升序的行号。我们可以这样做:
select type,data,@rownuma := @rownuma+1 as order_num
from my_table,(select @rownuma:=0) ra
where type='a'
我们可以对其他类型执行相同的操作,然后合并所有结果,然后将它们包装在执行排序的外部选择中。您的问题的答案将是以下查询:
select type,data
from
(
select type,data,@rownuma := @rownuma+1 as order_num
from my_table,(select @rownuma:=0) ra
where type='a'
union all
select type,data,@rownumb := @rownumb+1 as order_num
from my_table,(select @rownumb:=0) rb
where type='b'
union all
select type,data,@rownumc := @rownumc+1 as order_num
from my_table,(select @rownumc:=0) rc
where type='c'
) in_tab
order by order_num,type
请注意,对于每种类型,我们定义了一个不同的变量来进行计数。
最后一点,您可以在同一个连接中定义所有计数器,然后不使用全部联合,而是在选择中根据类型使用正确的变量。下面是一个相等查询
select type,data
from
(
select type,data,
case when type='a' then @rownuma := @rownuma+1
when type='b' then @rownumb := @rownumb+1
when type='c' then @rownumc := @rownumc+1
end as order_num
from my_table, (select @rownuma:=0) ra, (select @rownumb:=0) rb, (select @rownumc:=0) rc
) in_tab
order by order_num,type
如果您有更多的条件(where 子句)来选择行,那么第二个版本会更好,因为您不需要在第一个版本中属于联合的每个子查询中重复它们。