it-swarm.asia

طريقة العرض SELECT تحتوي على استعلام فرعي في جملة FROM

لديّ جدولان وأريد إنشاء طريقة عرض. الجداول هي:

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)
105
Raouf Athar

حسب الوثائق:

MySQL Docs

  • لا يمكن أن تحتوي عبارة SELECT على استعلام فرعي في جملة FROM.

سيكون الحل الخاص بك لإنشاء طريقة عرض لكل من الاستعلامات الفرعية الخاصة بك.

ثم الوصول إلى وجهات النظر هذه من وجهة نظرك view_credit_status

148
Nonym
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)
16
Michał Powaga

كما أحدث وثائق MySQL على قيود العرض يقول:

قبل MySQL 5.7.7 ، لا يمكن استخدام الاستعلامات الفرعية في جملة FROM لطريقة العرض.

هذا يعني أن اختيار MySQL v5.7.7 أو إصدار أحدث أو ترقية مثيل MySQL الحالي إلى مثل هذا الإصدار ، سيزيل هذا التقييد على طرق العرض تمامًا.

ومع ذلك ، إذا كان لديك إصدار MySQL حالي للإنتاج أقدم من الإصدار 7.5.7 ، فيجب أن تكون إزالة هذا التقييد على المشاهدات أحد المعايير التي يتم تقييمها أثناء اتخاذ قرار الترقية أو لا. قد يكون استخدام أساليب الحل البديل الموضحة في الإجابات الأخرى حلاً أكثر قابلية للتطبيق - على الأقل على المدى القصير.

12
Shadow

يبدو لي أن MySQL 3.6 يعطي الخطأ التالي بينما لم يعد MySQL 3.7 يخطئ. لم أجد حتى الآن أي شيء في الوثائق المتعلقة بهذا الإصلاح.

0
user3809638