0
SELECT * From `users` AS `User`
LEFT JOIN `selections` AS `Selections` ON (`Selections`.`user_id` = `User`.`id`)
LEFT JOIN  `clients` AS `Client` ON (`Client`.`id` = `Selections`.`client_id`)
LEFT JOIN  `client_stats` AS `ClientsStat` ON (`ClientsStat`.`date` = """DATE1""")

問題は、date = "DATE1" から同じフィールドを差し引いた ClientsStat のいくつかのフィールドの値を取得したいのですが、日付 #2 ですが、LEFT JOIN でそれを行う方法がわかりません。同じテーブルに別の LEFT JOIN を実行し、名前を変更して減算しようとしましたが、実行時間が非常に長くなったので、私の方法が悪かったと思います。

編集:

私の結果は次のようなものです:

USER => fields...
SELECTIONS => fields...
CLIENTS => fields..
CLIENT_STATS => field x,y,z on date = date 1

等々。

私はこれが欲しい:

USER => fields
USERSELECTIONS => fields...
CLIENTS => fields..
CLIENT_STATS => field x,y,z when client_stats.date = date1 MINUS field x,y,z when client_stats.date = date2

4

2 に答える 2

1

統計の二重結合が得意なはずです。パフォーマンスは、インデックスに基づいていると思います。ただし、左結合を意味しますか (2 番目の一致に関係なく、最初のテーブルでのみ必要です)。それとも... INNER JOINのことですか? 結合の両側でレコードを期待しています。ある記録日と別の記録日から値を減算しようとしている場合、両方のエントリが見つかると予想されます。「LEFT JOIN」の代わりに「JOIN」(両側が存在する必要があります)の基礎として書きました。

SELECT 
      U.* 
      CS1.x - CS2.x as XDiff,
      CS1.y - CS2.y as YDiff,
      CS1.z - CS2.z as ZDiff
   From 
      users U
         JOIN selections S
            ON U.ID = S.User_ID
            JOIN clients C
               ON S.Client_ID = C.ID
               JOIN  client_stats CS1
                  ON ( C.ID = CS1.Client_ID AND CS1.`date` = YourFirstDateVariable )
               JOIN  client_stats CS2
                  ON ( C.ID = CS2.Client_ID AND CS2.`date` = YourSecondDateVariable )

これがあなたが探していたものかどうかは絶対にわかりませんが、見逃した要素の 1 つは、ちょうど日付のクライアント統計テーブルへの結合だったと思います...どのクライアント ID に修飾子がなかったため、おそらく失敗でしたあなたのパフォーマンス。client_Stats に (client_id,date) のインデックスがあることを確認します。これは、client_id が欠落しており、client_stats テーブルの一部である場合です。

于 2012-06-14T17:01:29.153 に答える
0

最初: 他のテーブルの 1 つのフィールドを使用して、client_stats に参加する必要があります。そのため、最初に結合が正しく機能するようにします。現在の方法 - そのクエリは実行されますか? 2 番目: 次に、日付の WHERE 句を使用して ClientsStat.date の日付範囲を制限できます。

WHERE ClientsStat.date >= 'date1' AND ClientsStat.date <= 'date2'

またはそのようなもの。

(何をしようとしているのかを正確に確認するには、テーブルに関する詳細情報が必要になる場合があります)。原則として、必要以上の行を返すクエリを実行してから、それらを削減する方法を考え出します。

于 2012-06-14T16:35:04.077 に答える