2017-10-21 5 views
-1

J'ai une table avec deux colonnes simples que ce violon Sql fiddlerMySQL commande par deux colonnes avec la norme singulière

Je voudrais cet ordre:

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

je veux l'ordre par avec la colonne « id », mais si 'id' = 2 alors next doit être 'id' avec la même valeur 'rev'.

C'est possible?

[EDIT] Excusez-moi, j'ai modifié le Fiddler ...

[EDIT 25/10] J'ai essayé de modifier ma requête avec @ P.Salmon réponse quand id de la première table est 'militare'. Mais il y a une erreur

1054 - Unknown column « rev » dans « liste des champs »

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

Quelle est la logique pour cela? –

+0

pouvez-vous expliquer la commande? Je ne peux pas voir les règles pour "ORDER BY"! –

+2

_ "Je voudrais cet ordre:" _ - basé sur _what_? Fournir un sqlfiddle seul ne va pas aider, si vous n'expliquez pas du tout à quoi cet ordre est censé être basé. De plus, la colonne 'rev' de votre violon contient trois' 2', et seulement un '3'. Et même pas l'association entre 'id' et' rev' est la même que dans votre exemple de sortie attendue ...? – CBroe

Répondre

1

Votre logique n'a pas de sens donné vos données et ce que vous avez dit que je attendre la sortie comme celui-ci

+----+-----+ 
| 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) 

ou si vous traitez rev 1 comme un cas particulier, vous pouvez

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 

Résultat

+----+-----+ 
| 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

Si j'ai demandé ici c'est juste parce que je ne peux pas. Je veux commander la colonne 'id', mais avec ma norme. Je ne comprends pas si c'est l'insécurité de mon anglais ou quoi ... – Gian76

+0

Il n'y a pas une règle claire pour obtenir le résultat que vous voulez, vous avez déclaré que je veux commander par la colonne 'id', mais si 'id' = 2 alors la prochaine doit être 'id' avec la même valeur 'rev' mais cela semble aussi s'appliquer pour rev 1 et 3 et il n'y a pas de raisons évidentes pour que rev 1 et rev 3 se comportent différemment de rev 2. Ce n'est pas un commenter sur le code c'est purement sur la logique. –

+1

Veuillez vous référer à éditer où rev 1 est traité comme un cas particulier. –