私の問題を説明する最も簡単な方法は、おそらくテーブルと取得しようとしている結果を示すことです。最後に試行したクエリが一番下にあります (機能しません)
次のテーブルがあります(簡単にするために、一連の列を削除しました):
クライアント テーブル:
------------------------- | client_id | name | ------------------------- | client_1 | Bob | ------------------------- | client_2 | Jane | ------------------------- | client_3 | Amy | -------------------------
契約表:
--------------------------------------------- | contract_id | client_id | amount | date | --------------------------------------------- | contract_1 | client_1 | $5 | 01/02 | --------------------------------------------- | contract_2 | client_1 | $25 | 21/03 | --------------------------------------------- | contract_3 | client_2 | $40 | 25/05 | ---------------------------------------------
セッション テーブル:
------------------------------------------ | session_id | client_id | contract_id | ------------------------------------------ | session_1 | client_1 | contract_1 | ------------------------------------------ | session_2 | client_2 | contract_3 | ------------------------------------------ | session_3 | client_2 | contract_3 | ------------------------------------------ | session_4 | client_1 | contract_2 | ------------------------------------------ | session_5 | client_1 | contract_1 | ------------------------------------------
次のように、テーブルを結合し、すべての行を client_id と contract_id でグループ化する必要があります。
client 1, Bob
|___ contract_1, $5, 01/02
|___ Session 1
|___ Session 5
|___ contract_2, $25, 21/03
|___ Session 4
client 2, Jane
|___ contract_3, $40, 25/05
|___ Session 2
|___ Session 3
client 3, Amy
私の最近の試みは、テーブルで完全な外部結合を実行し、結果を client_id と contract_id でグループ化することでした。
SELECT * FROM
(SELECT
*
FROM
contracts
LEFT OUTER JOIN
clients
ON
clients.client_id = contracts.client_id
UNION
SELECT
*
FROM
contracts
LEFT OUTER JOIN
sessions
ON
sessions.client_id = contracts.client_id)
AS tmp_table GROUP BY client_id, contract_id
さまざまなテーブルの列の数が異なるため (すべての列が必要なので、運が悪いため)、完全な外部結合の回避策は失敗し、「GROUP BY」はそれぞれの 1 行のみを返すように見えます (すべての行が必要なので、私にはうまくいきません。
この場合、パフォーマンスはまったく問題になりません。
それは私が必要とすることをするように見えます。回答を承認する前に、それを自分の生産テーブルに適応させ、見落としがないかどうかを確認します