したがって、取得するデータに時間がかかりすぎるアプリケーションのクエリを最適化できる幸運な人です。私たちが探しているデータはそれほど複雑ではありませんが、データベースの設計が安っぽいため、本来よりもはるかに困難になっています (これは素晴らしいことです。なぜなら、私が約 1 年前に設計したからです)。
一般的な考え方は、各顧客の総売上 (残高を増やす何かを購入する) と総支払い (残高に対してお金を支払った) を計算しようとしているということです。
テーブル:
お客様
- ID
- 会社
売上(請求書):
- ID
- 顧客ID
支払い (account_payments)
- ID
- 顧客ID
- transaction_id (invoice_transactions へのリンク)
トランザクション (invoice_transactions)
- ID
- 請求書 ID (請求書へのリンク、支払いの場合は null)
- 額
ユーザーが販売を行った場合、情報は と に記録されinvoices
、invoice_transactions
invoice_transactions は customer_id を含む送り状レコードの送り状 ID を持ちます。
ユーザーが支払いaccount_payments
を行う場合、情報はとに記録されinvoice_transactions
ます。invoice_transaction のinvoice_id は NULL であり、account_payments には transaction_id と customer_id が含まれます。
私は知っている、それはひどいです.そして、私は自分が賢いと思っていました! さて、私は問題を熟考し、まともな解決策を思いつきました:
SELECT SQL_NO_CACHE
c.company,
(SELECT SUM(amount) FROM sales),
(SELECT SUM(amount) FROM payments)
FROM customers c
JOIN invoices i ON i.customer_id = c.id
JOIN invoice_transactions sales ON i.invoice_id = sales.id
JOIN account_payments ap ON ap.customer_id = c.id
JOIN invoice_transactions payments ON ap.transaction_id = payments.id
「#1146 - テーブル 'db.sales' が存在しません」というエラーが表示される以外は、まったく何もしません。結合の前にサブクエリが読み込まれることに関係があると思いますが、正直なところわかりません。残念ながら、この問題に対処する別の方法がわかりません...誰かが私に手を差し伸べてくれたらとてもありがたいです!