2016-07-29 36 views
0

Ich habe eine TabellenstrukturSpiel Funktion für integer in mysql

ID Col_1 col_2 col_3 col_4 max 
    1 34  23  45  32 45 
    2 20  19  67  18 67 
    3 40  10  76  86 86 

ich so etwas wie dies ableiten will, wird der Rang Spalt abgeleitet von dem „max“ Spaltenwert gegen Spalten wie „col_1“ nachschlagen, "col_2", "col_3", "col_4". und es soll mir den Index oder die Spaltennummer zurück, die für col_1 von 1 beginnt, 2 für col_2 und so weiter

ID Col_1 col_2 col_3 col_4 max rank 
    1 34  23  45  32 45 3 
    2 20  19  67  18 67 3 
    3 40  10  76  86 86 4 

das ist, was ich habe versucht, aber nicht in der Lage die gewünschte Ausgabe zu erhalten. jede Hilfe wäre willkommen.

SELECT ID,Col_1,col_2,col_3,col_4,max, match(max) AGAINST(col_1,col_2,col_3,col_4) from demo; 

Antwort

2

Hier ist eine Methode, das heißt eher Brute-Force:

select d.*, 
     (case greatest(col_1, col_2, col_3, col_4, col_5) 
      when col_1 then 1 
      when col_2 then 2 
      when col_3 then 3 
      when col_4 then 4 
      when col_5 then 5 
     end) as max_index 
from demo d; 

Als Anmerkung: Die Notwendigkeit, diese Art der Operation zu tun, schlägt vor, ein fehlerhaftes Datenmodell. Die Spaltenwerte sollten wahrscheinlich in einer Tabelle mit einem solchen Wert pro Zeile gespeichert werden.

Ich sollte auch beachten Sie, dass Sie dies mit field() tun können:

select d.*, 
     field(greatest(col_1, col_2, col_3, col_4, col_5), 
      col_1, col_2, col_3, col_4, col_5) 
from demo d; 

Dies ist etwa die gleiche Anstrengung rechnerisch, aber es ist auf jeden Fall in der Länge viel kürzer.

+0

Ich habe es .... Vielen Dank @GordonLinoff – Deepesh