我有一个包含两个简单列的表格作为这个小提琴Sql fiddler
我会这样命令:
id rev
==========
1 1
2 3
6 3
3 1
4 2
10 2
5 1
7 1
8 1
9 1
我希望使用列' id'进行排序,但如果' id' = 2,那么next必须是' id'同样的' rev'值。
有可能吗?
[编辑]对不起,我修改了小提琴手......
[编辑25/10] 当第一个表的id为“militare”时,我尝试用@ P.Salmon回答编辑我的查询。 但是有一个错误
1054 - 未知专栏' rev'在'字段列表'
SELECT
`militari`.`ordine` militare,
`ordini_servizio_dati`.`id_pattuglia` rev,
`ordini_servizio_dati`.`oggetto_servizio`,
`ordini_servizio_dati`.`luogo`,
`ordini_servizio_dati`.`orario`,
`ordini_servizio_dati`.`aut_orario`,
`ordini_servizio_dati`.`siris`
FROM
`ordini_servizio_inizializzati`,
(
select
militare,
rev,
if(rev <> @p, @rn := 1, @rn := @rn + 1) rn,
if(
rev <> @p, @min := militare, @min := @min
) minid,
@p := rev p
from
`ordini_servizio_dati`,
(
select
@min := 0,
@rn := 0,
@p := 0
) r
order by
rev,
militare
) s
LEFT JOIN `schedario`.`ordini_servizio_dati` ON `ordini_servizio_inizializzati`.`id` = `ordini_servizio_dati`.`id_ordine`
LEFT JOIN `schedario`.`militari` ON `ordini_servizio_dati`.`militare` = `militari`.`matricola`
WHERE
(
`ordini_servizio_inizializzati`.`id` = '1'
)
order by
case when rev = 1 then militare else minid end,
rn
答案 0 :(得分:1)
根据您的数据以及您所说的内容我的预期输出
,您的逻辑没有意义+----+-----+
| id | rev |
+----+-----+
| 1 | 1 |
| 3 | 1 |
| 5 | 1 |
| 7 | 1 |
| 8 | 1 |
| 9 | 1 |
| 2 | 3 |
| 6 | 3 |
| 4 | 2 |
| 10 | 2 |
+----+-----+
10 rows in set (0.03 sec)
或者如果您将rev 1视为特殊情况,您可以
select id,rev
#case when rev = 1 then id
#else minid
#end as overwrite
from
(
select id,rev,
if(rev<>@p,@rn:=1,@rn:=@rn+1) rn,
if(rev<>@p,@min:=id,@min:=@min) minid,
@p:=rev p
from docs, (select @min:=0, @rn:=0,@p:=0) r
order by rev,id
) s
order by case when rev = 1 then id
else minid
end ,
rn
结果
+----+-----+
| id | rev |
+----+-----+
| 1 | 1 |
| 2 | 3 |
| 6 | 3 |
| 3 | 1 |
| 4 | 2 |
| 10 | 2 |
| 5 | 1 |
| 7 | 1 |
| 8 | 1 |
| 9 | 1 |
+----+-----+
10 rows in set (0.03 sec)