2017-10-30 4 views
0

私はこのようになりますテーブルがありますので、もし私が、私が取得する必要があり、行の量のパーセンタイルを表す列を持つ別のテーブルを持っている列の値でLIMIT静的な値を交換

ID  Damage 
1  10 
2  7 
3  153587 
4  1 
...1M more rows 

をその上位10パーセンタイルの列の値は100000になります。ダメージに基づいて取得します。

パーセンタイルが100000を本質的に変数または列の値に置き換えるように変更されたため、LIMIT 100000というよりも方法がありますか?

セカンドテーブル:IDは何のギャップがなかった

Days Percentile_Affected Damage_Sum 
14  87000 
30  161000 
90  371000 
... 
+0

私はSql ServerがTOPを介して簡単な方法でこれをサポートしていることを知っていますが、MySqlについてはそれほど確実ではありません。 TOPキーワードとLIMITキーワードのどちらも標準SQLではなく、IIRC LIMITはパーセントまたはネストされたSELECT式ではなく、行数リテラルのみをサポートしています。 SQL標準では、式をサポートするOFFSET/FETCH(ネストされたSELECT)を使用しますが、MySqlはOFFSET/FETCHをまったくサポートしていません。おそらくあなたが使用できるいくつかの複雑な回避策があります。 –

+1

2番目の表の外観を見せてください。 –

+0

私は2番目のテーブルを追加しました。私は、percentile_affectedカラムを使用して制限しています。私はntileを使用しようとしていますが、NTILE()は定数を必要としています。 – Qwerty

答えて

1

場合は、あなただけのidを使用することができます。代わりに、カウント変数を追加し、その使用することができます。

select @sql := replace('select t.* from t limit [limit]', [limit], "a column") 
from "another table"; 

prepare stmt from @sql; 
execute stmt; 

または、制限のためのプレースホルダを使用します:

select t.* 
from (select t.*, (@rn := @rn + 1) as rn 
     from (select t.* 
      from t 
      order by id 
      ) t cross join 
      (select @rn := 0) params 
    ) t 
where rn < (select "a column" from "another table"); 

代替クエリを作成して、動的SQLを使用することです

set @sql = 'select t.* from t limit ?'; 
select @limit := "a column" 
from "another table"; 

prepare stmt from @sql; 
execute stmt using @limit; 
+0

IDにギャップしかし、私はそれを最も高いダメージ値から除外し、それらからトップを取って欲しいので、それらはまた、順不同である可能性が高い。 – Qwerty