2つのテーブルがあり、ビューを作成する必要があります。表は次のとおりです。
credit_orders(id, client_id, number_of_credits, payment_status)
credit_usage(id, client_id, credits_used, date)
これを行うには、次のクエリを使用します。 「ビューの作成」部分のないクエリは正常に機能しますが、「ビューの作成」では、「ビューのSELECTにFROM句にサブクエリが含まれています」というエラーが表示されます。問題と考えられる解決策は何ですか:
create view view_credit_status as
(select credit_orders.client_id,
sum(credit_orders.number_of_credits) as purchased,
ifnull(t1.credits_used,0) as used
from credit_orders
left outer join (select * from (select credit_usage.client_id,
sum(credits_used) as credits_used
from credit_usage
group by credit_usage.client_id) as t0
) as t1 on t1.client_id = credit_orders.client_id
where credit_orders.payment_status='Paid'
group by credit_orders.client_id)
ドキュメントに従って:
回避策は、サブクエリごとにビューを作成することです。
次に、ビュー内からこれらのビューにアクセスしますview_credit_status
create view view_clients_credit_usage as
select client_id, sum(credits_used) as credits_used
from credit_usage
group by client_id
create view view_credit_status as
select
credit_orders.client_id,
sum(credit_orders.number_of_credits) as purchased,
ifnull(t1.credits_used,0) as used
from credit_orders
left outer join view_clients_credit_usage as t1 on t1.client_id = credit_orders.client_id
where credit_orders.payment_status='Paid'
group by credit_orders.client_id)
表示制限 に関する最新のMySQLドキュメントが言うように:
MySQL 5.7.7より前は、ビューのFROM句でサブクエリを使用できません。
つまり、MySQL v5.7.7以降を選択するか、既存のMySQLインスタンスをそのようなバージョンにアップグレードすると、ビューに関するこの制限が完全に削除されます。
ただし、v5.7.7よりも前の現在の実稼働MySQLバージョンがある場合、ビューのこの制限の削除は、アップグレードするかどうかを決定する際に評価される基準の1つにすぎません。他の回答で説明されている回避策のテクニックを使用すると、より実行可能なソリューションになる可能性があります-少なくとも短期的には。
MySQL 3.6では次のエラーが発生しますが、MySQL 3.7ではエラーが発生しなくなりました。この修正に関するドキュメントにはまだ何もありません。