ما هو الخطأ في استعلام MySQL الخاص بي؟
-
21-09-2019 - |
سؤال
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 () جيدة إذا كان تركيزك حصريًا على نتائج النوع النصي ، على سبيل المثال للكتابة ، كما هو الحال ، في تقرير ، وإلا ، فمن الأفضل الحفاظ على النتائج في أعمدة منفصلة ، لمزيد من المعالجة ، الجداول وما إلى ذلك ...