私はこれでタオルを投げようとしています。Mysql:サブクエリから最大N値で注文
はじめに:私は(特にMySQLの、)クエリを持って、私は任意のNと、この作品を作りたいが、簡単のために、私は3
ようにNを設定しますする必要がありますテーブルからデータを取り込み、そのテーブルの上位3つの値に基づいてソートし、その後に他のソート基準にフォールバックします。すべての基本的な教科書のものはどれ
SELECT tbl.id
FROM
tbl1 AS maintable
LEFT JOIN
tbl2 AS othertable
ON
maintable.id = othertable.id
ORDER BY
othertable.timestamp DESC,
maintable.timestamp DESC
:
だから基本的に私はこのような何かを持っています。しかし問題は、othertable.timestampの3つの最大値を取得してmaintable.timestampをフォールバックするだけで、最初のORDER BY節が必要になることです。
また、othertableにLIMIT 3サブクエリを実行して参加させることは、maintableに適用される任意の数のWHERE条件で動作する必要があるため、必要ありません。
私はそれがこのようなユーザ変数ベースのアプローチで動作させることはほとんどできましたが、それは最初に見つかった3つのothertable値取りますので、それは、アカウントの順序に入れていないので、それは失敗します。
をそう...この上の任意のヒント:(ステートメントの前に= 0 @rank付き)
ORDER BY
(
IF(othertable.timestamp IS NULL, 0,
IF(
(@rank:[email protected]+1) > 3, null, othertable.timestamp
)
)
) DESC
?私はこの問題で私の心を失っている。これに対して私が持っているもう一つのパラメータは、既存の(非常に複雑な)クエリを変更するだけなので、ラッピングアウタークエリを実行できないということです。また、前述のように、私はMySQL上にあるので、ROW_NUMBER関数を使用するすべてのソリューションは残念ながら手の届かないところにあります。
ありがとうございます。
EDIT。
maintable
id timestamp
1 100
2 200
3 300
4 400
5 500
6 600
othertable
id timestamp
4 250
5 350
3 550
1 700
=>
1
3
5
6
4
2
そして、何らかの理由で、私たちは、WHEREクエリに= 5をmaintable.idないで追加した場合、ここで我々が得るべきものです:ここで私は必要なものを説明するための単純な整数にダウン易しく書き直さタイムスタンプを持ついくつかのサンプルデータです
1
3
4
6
2
...これは、このセットを参照しているothertableの上位3つの値のうちの1つです。
したがって、othertableからのIDが4の行は、タイムスタンプ値の降順で4番目であるため、順序に含まれていないため、基本タイムスタンプの順序に戻ります。
「maintable」のコンテンツと「othertable」は基本的にタイムスタンプが「特集の日付」のおすすめコンテンツのマーカーです。私は最後の3つの特集記事を上に浮かべるべきで、残りのリストはちょうど逆の年代順のリストであると考えています。
私はこの問題を抱えています。サンプルデータと希望の結果を表示できますか? – Barmar
maintableに適用される任意のWHERE条件で作業する必要がある理由は、othertableでLIMIT 3サブクエリを実行できないのはなぜですか? –
ニースのブログ投稿:http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ – Prasanth