MySQLの結合クエリでの計算
P粉726234648
P粉726234648 2024-02-17 22:58:39
0
2
455

いくつかの計算があり、これをクエリで実行したいと考えています。

1 対多の関係を持つ parent テーブルと child テーブルがあります:

リーリー リーリー

親の最終値を見つけるには、子を反復処理して次の式を計算する必要があります。 newParentValue = childMultiple(parentValue childSum)

コードでの実装は次のとおりです:

リーリー

クエリに計算を実装するにはどうすればよいですか?

私はこの方法を試しました (一時変数を使用):

リーリー

結合条件 (@value := p.value) に変数を設定して、新しい親ごとに変数をリセットします。

このクエリは、各親の行と子の数を返します。答えとして各親結合の最後の行が必要です。

しかし、この方法は持続可能ではありません。もっと良い方法はありますか?

###例:### リーリー

上記のデータに基づいて、次のような答えが得られると予想します:

リーリー

parent.id=1 の場合、3 つの子があり、parent.value は 10 であるため、最初の子の数式を計算した後の新しい値は

1 * (10 1) = 11

になります。いいえ。2 番目の子の値は 1 * (11 1) = 12 です。予想どおり、3 番目の子の値は 1 * (12 1) = 13 です (合計) 3 人の子はすべて倍数であり、合計は 1 に等しくなります)。 parent.id=2 の場合、2 つの子があり、parent.value は 20 であるため、最初の子の数式を計算した後の新しい値は

2 * (20 2) = 44

になります。 2 番目の子の値は 2 * (44 2) = 92 (どちらの子も倍数であり、合計は 2 に等しい) です。 結局、各親の最終値が必要なので、最終的に期待される結果は次のようになります:

リーリー

例を簡単にするために、各親の子テーブルのすべての

multiply

列と sum 列は等しく (異なる値を想定)、最終値は最大値です。毎回最大値になるとは限りません。

P粉726234648
P粉726234648

全員に返信(2)
P粉493313067

ROW_NUMBER() ウィンドウ関数を使用して、children の行をランク付けし、parent_id で分割し、id で分割します。 SUM()ウィンドウ関数はソートして目的の合計を取得します。
最後に、FIRST_VALUE() ウィンドウ関数を使用して、各 ID の最後の合計を取得します。 リーリー

表示

デモ

いいねを押す +0
P粉959676410

親が変更されると、途中で値をリセットする必要があるため、少し注意が必要です。

次のクエリを試してください:

リーリー

上記の CASE ステートメントを IF ステートメント (より読みやすく) に置き換えることもできます。 リーリー

これにより、必要な出力が得られるはずです。

2 つの変数

@current_parent_value@running_parent を使用しました。

@running_parent は、前の行と現在の行が同じ parent に属しているかどうかを判断するのに役立ち、@current_parent_value は現在の行を保存するのに役立ちます。ランニングバリュー。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!