2

これは比較的高度な質問だと思うので、うまく質問できないかもしれません。せせらぎについては事前にお詫び申し上げます。

Mysql のグループ化機能が大好きです。MIN()、MAX() などを使用すると、特定の共通要素によって行を簡単にグループ化し、グループ化された行の各プールの顕著な特徴を取得できます。しかし、私が尋ねている質問は、この動作が発生することを望まない場合に関連しています。むしろ、特定の状況では、一連の行 (10 としましょう) を 1 つの行にグループ化するときに、行ごとに異なる値について、グループ化された結果の行に表示されるすべての値が派生したものであることを確認したいと考えています。事前にグループ化された同じ行。私の質問: これは可能ですか? 気をつけるべき穴はありますか?

このクエリの構造を少し紹介します。コアには、「親」テーブル (ここでは t1) が「子」テーブル (ここでは t2) に結合されています。クエリの結果は、グループ化または並べ替えの前に、同じ t1 レコードが複数回リストされ、異なる t2 レコードと値に関連付けられている場合があります。各 t1 レコードが 1 回だけ表示され、各行に表示される t2 値が (その t1 レコードに関連付けられたすべての t2 レコードの中で) 優先度が最も高い t2 レコードを反映するように、最終出力をグループ化する必要があります。例として、以下の簡単なクエリを参照してください。

私の実験に基づいて、ネストされたクエリでこれを実行できるように思われます。最初に ORDER し、次に GROUP します。GROUP 操作は、遭遇した最初の行の値を確実に保持しているようです。つまり、ORDER を実行してから GROUP を実行すると、グループ化された出力に含まれる値を適切に制御できるはずです。

これは、私が計画しているクエリ構造の例です。私の質問:何か足りないものはありますか? これを私にとって悪い計画にするような方法で GROUP が振る舞った経験はありますか? 私が説明していることを達成するためのより簡単な方法を考えてもらえますか?

前もって感謝します!

SELECT * FROM (
  選択する
    # t1 からの各レコードは、最終出力に 1 回だけ表示される場合があります。
    t1.id、t1.field2、t1.field3、t1.field4、
    # 複数の t2 レコードがあります (それぞれに異なる値と優先度があります)
    # 各 t1 レコードに関連付けられています。
    t2.id AS t2_id、t2.field5、t2.field6、t2.priority
  から t1
    t1.id = t2.t1_id で t2 に参加
    {他のいくつかの結合}
  WHERE { たくさんの条件 }
  ORDER BY t2.priority ) t
GROUP BY t.priority
4

2 に答える 2

3

それはまったく信頼できません。DBMS は、上記のケースで返される行を指定しません。さらに言うと、これは MySQL の機能のみです。通常の SQL では、これは無効になります。非グループ列とグループ関数を混在させることです。この動作に関する詳細な説明は、このマニュアル ページに記載されています。

ただし、これは主に、GROUP BY で指定されていない各非集計列のすべての値が各グループで同じである場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。さらに、各グループからの値の選択は、ORDER BY 句を追加しても影響を受けません。結果セットの並べ替えは、値が選択された後に行われます。ORDER BY は、サーバーが選択する各グループ内の値には影響しません。

于 2013-10-10T15:20:21.407 に答える
2

どの DBMS でも機能する適切な結果を得る別の方法があります。元のクエリを取得すると、次のようになります。

SELECT 
    t1.id, t1.field2, t1.field3, t1.field4,
    t2.id AS t2_id, t2.field5, t2.field6, t2.priority
  FROM t1
    JOIN t2 ON t1.id = t2.t1_id AND t2.priority = 
        (Select Max(t2b.priority) From t2 AS t2b Where t1.id = t2b.t1_id)
    { several other joins }
  WHERE { lots of conditions }

(私は (t1.id, priority) によって t2 に1行しかないと仮定しました)

それが役に立てば幸い!

于 2013-10-10T15:53:57.473 に答える