2017-08-18 19 views
0

こんにちは、私は 'target_hours'という名前のテーブルがあります。 (L1、L2、L3、L4、L5)が割り振られ、表の中で時間単位で次のように示されています。mysqlテーブルの列名を選択

|L1 | L2 | L3 | L4 | L5 | 
|---| --- | ---|--- |--- | 
|192| 168 | 144| 120| 96 | 

私はちょうど条件の下に、以下によりmysql queryを使用して、特定の時間で完了している特定の仕事のレベル(提出された名前)を取得する必要があります。一例として、X時間かかることができます。

L5 --> L5 >= x hours 
L4 --> L4 >= x hours > L5 
L3 --> L3 >= x hours > L4 
L2 --> L2 >= x hours > L3 
L1 --> L1 >= x hours > L2 

たとえば、特定のタスクが135時間で完了した場合、クエリはL3として出力されます。

+1

この種の問題は、設計が不良であることを示します。 – Strawberry

答えて

0

私はこの問題を解決する一つの方法は、労働組合の束になり、これは貧しいデザインの症状であることに同意しないが:

select 
    lvl 
from (
    select l1 as lvl from limits 
    union all 
    select l2 from limits 
    union all 
    select l3 from limits 
    union all 
    select l4 from limits 
    union all 
    select l5 from limits 
    order by 
    lvl asc 
) x 
where 
    lvl > 135 
limit 
    0, 1 
0

最善の解決策は、移動することによって、あなたのテーブル構造の正常化になります列から列への様々なレベル:この場合

level, hours 
L1 , 192 
L2 , 168 
... 

クエリは次のようになります。

select * from target_hours where hours>... 
order by hours asc limit 1 

このソリューションの利点は、柔軟性があり(必要な数のレベルを持つことができます)、クエリでインデックスを使用できることです。あなたは、現在のテーブル構造を維持することを主張する場合は

は、あなたが期待される結果を達成するためにcase expressionを使用することができます:あなたはより多くのレベルをチェックする必要がある場合、その後、あなたが持っているので

select case 
      when L5>=... then L5 
      when L4>=... and ...>L5 then L4    
      when L3>=... and ...>L4 then L3 
      when L2>=... and ...>L3 then L2 
      when L1>=... and ...>L2 then L1 
     end as hours 
from target_hours 

このソリューションは柔軟性に欠けていますテーブル構造とクエリの両方を変更します。また、索引を使用して関連する値を見つけることもできません。

関連する問題