mysql命令由两列带有单数标准

时间:2017-10-21 09:04:35

标签: mysql sql

我有一个包含两个简单列的表格作为这个小提琴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

1 个答案:

答案 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)