2017-10-21 56 views
-1

我有两个简单的列的表,因为这小提琴Sql fiddlermysql命令由两列奇标准

我想这个命令:

id rev 
    ========== 
    1  1 
    2  3 
    6  3 
    3  1 
    4  2 
    10  2 
    5  1 
    7  1 
    8  1 
    9  1 

我想为了通过与塔“身份证”,但如果'id'= 2,则下一个必须是具有相同'rev'值的'id'。

有可能吗?

[编辑]对不起,我修改了小提琴手......

[编辑25/10] 我试图编辑我的查询与@ P.Salmon回答时第一个表的ID是“militare”。 但有一个错误

1054 - 在“字段列表”未知列“转”

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

有什么逻辑呢? –

+0

你能解释一下这个命令吗?我看不到'ORDER BY'的规则! –

+2

_“我会这样的命令:”_ - 基于_what_?如果你根本不解释这个命令是基于什么的话,单独提供一个sqlfiddle是无济于事的。另外,小提琴中的“rev”列包含三个“2”,并且只有一个“3”。甚至连'id'和'rev'之间的关联都没有和你预期的输出结果一样...? – CBroe

回答

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) 

,或者如果你把转1作为一个特殊的情况下,你可以

输出210
select id,rev 
     #case when rev = 1 then id 
     #else minid 
     #end as overwrite 
from 
(
select id,rev, 
     if(rev<>@p,@rn:=1,@rn:[email protected]+1) rn, 
     if(rev<>@p,@min:=id,@min:[email protected]) 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) 
+0

如果我在这里问这是因为我不能。我想要'id'专栏排序,但与我的标准。我不明白,如果这是我的英语的不安全或什么... – Gian76

+0

没有明确的规则来获得你想要的结果,你已经说明我想通过'id'列来订购,但是如果'id' = 2,那么下一个必须是具有相同'rev'值的'id',但似乎也适用于rev 1和3,并且没有明显的理由让rev 1和rev 3的行为与rev 2有所不同。这不是关于代码的评论纯粹是关于逻辑。 –

+1

请参阅编辑第1版被视为特殊情况。 –