سؤال

SELECT
  ( SELECT
       SUM(IF(status = 'Active', 1, 0)) AS `univ_active`,
       SUM(IF(status = 'Inactive', 1, 0)) AS 'univ_inactive',
       Count(*)
    FROM online_university
  ) 
 AS tot_university,
( SELECT 
    SUM(IF(status = 'Active', 1,0)) AS `user_active`,
    SUM(IF(status = 'Inactive', 1,0)) AS 'user_inactive'
    Count(*)
  FROM online_register_user)
AS tot_users

يجب أن تكون النتيجة

univ_active=4 univ_inactive=2 tot_university=6
user_active=10 user_inactive=3 tot_users = 13

كيف يمكنني الحصول على هذا؟ خطأ عودة الاستعلام أعلاه: يجب أن يحتوي المعامل على 1 عمود (ق)

هذا لإعداد تقرير لمشروع من جميع الجداول التي تعود إلى إجمالي السجلات النشطة وغير النشطة من الجدول. إذا كانت هذه الطريقة خاطئة ، فماذا يجب علي المستخدم؟ أي اقتراح.

هل كانت مفيدة؟

المحلول

يمكن أن تُرجع الفخات الفرعية عمودًا واحدًا فقط. تحتاج إما إلى القيام بالعديد من الفسخات الفرعية ، أو الانضمام ، أو الاختراق المتسابق الرخيص (CONCAT_WS(',', SUM(IF(status = 'Active', 1,0)), SUM(IF(status = 'Inactive', 1,0))) في مسمة فرعية واحدة.

نصائح أخرى

كما يقول الخطأ ، فأنت تختار مساعًا فرعيًا يعيد عمودين.

SELECT (one_thing, another_thing) AS combined_thing

غير موجود في SQL. سيكون عليك وضع كل مساع فرعي من تلقاء نفسه:

SELECT (
    SELECT SUM(IF(status='Active', 1, 0)) FROM online_university
) AS univ_active, (
    SELECT SUM(IF(status='Inactive', 1, 0)) FROM online_university
) AS univ_inactive, (
    SELECT SUM(IF(status='Active' OR status='Inactive', 1, 0)) FROM online_university
) AS tot_university, (
    SELECT SUM(IF(status='Active', 1, 0)) FROM online_register_user
) AS user_active, (
    -- and so on

ومع ذلك ، لا توجد فائدة حقًا للقيام بكل هذا في استعلام واحد. أسهل بكثير في القول:

SELECT COUNT(*) FROM online_university WHERE status='Active';  -- univ_active
SELECT COUNT(*) FROM online_university WHERE status='Inactive';  -- univ_inactive
SELECT COUNT(*) FROM online_university;  -- tot_university
SELECT COUNT(*) FROM online_register_user WHERE status='Active';  -- user_active
    -- and so on

ثم قدم هذه النتائج معًا في طبقة التطبيق. A حيث يكون الشرط أسرع ويمكنه استخدام الفهارس المناسبة التي يعتبر تعبيرًا محسوبًا مثل SUM/if لا يمكن.

أبسط:

SELECT status, COUNT(*) FROM online_university GROUP BY status;
SELECT status, COUNT(*) FROM online_register_user GROUP BY status;

كما قال Bipedalshark ، يجب أن يكون لاستفساراتك عمود واحد ولديهم 2 الآن. ولكن إلى جانب ذلك ، يجب أن تفكر في استخدام COUNT (*) وأين شرط. لذلك يجب أن يكون SMTH مثل هذا:

select
 (select count(*) from online_university where status = 'Active') as univ_active,
 (select count(*) from online_university where status = 'Inactive') as univ_inactive,
 (select count(*) from online_register_user where status = 'Active') as user_active,
 (select count(*) from online_register_user where status = 'Active') as user_inactive

من خلال تخطيط الاستعلام كما فعلت للتو في السؤال ، يصبح من الواضح جدًا أن الاسم المستعار tot_university ، على سبيل المثال سوف يرتبط بعمدين ، وهو أمر غير ممكن ...

بصرف النظر عن هذا الخطأ في بناء الجملة/المنطق ، يبدو الاستعلام بأكمله منظمًا بشكل سيئ لإنتاج النتيجة المرجوة.

يشبه إلى حد كبير الواجب المنزلي ، أو التعلم المعين ذاتيًا ، لذلك لن أفسدها باستعلام جاهز ، بدلاً من ذلك ، إليك بعض التلميحات.

  • تأتي المعلومات من جدولين متميزين غير مرتبطين ، ربما تستخدم الاتحاد للحصول على نتائج في استعلام واحد (مع تشغيل Quenties بشكل فعال) (يمكنك بعد ذلك استخدام عمود إضافي مع بعض النص مثل "Univ" ، "عام" للتمييز بين الاثنين خطوط)
  • يعد المبلغ (إذا كان العمود = x ، 1،0) خدعة جيدة لحساب قيم معينة ، دون الحاجة إلى القيام بمجموعة من خلال ، بشكل أساسي "تدوين" التهم في خطوة واحدة.
  • تكون خدعة Concat () جيدة إذا كان تركيزك حصريًا على نتائج النوع النصي ، على سبيل المثال للكتابة ، كما هو الحال ، في تقرير ، وإلا ، فمن الأفضل الحفاظ على النتائج في أعمدة منفصلة ، لمزيد من المعالجة ، الجداول وما إلى ذلك ...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top