কোনও কলাম বিদ্যমান থাকলে সুনির্দিষ্ট সারিগুলি বা কলাম না থাকলে সমস্ত সারি কীভাবে নির্বাচন করবেন


23

আমি একটি স্ক্রিপ্ট লিখছি যা কয়েকটি টেবিলের জন্য সারিগুলির একটি গণনা পেয়েছে, তবে কিছু টেবিলের জন্য আমি কেবলমাত্র একটি পতাকা নির্ধারিত সারিগুলির একটি গণনা পেতে চাই (এই ক্ষেত্রে সক্রিয় = 1)। আমি কীভাবে কোনও ক্যোয়ারিতে এটি করতে পারি?

উদাহরণ:

সারণীতে usersসক্রিয় বলা একটি কলাম রয়েছে

সারণীতে clientsঅ্যাক্টিভ নামে পরিচিত একটি কলাম নেই

আমি যেখানে সক্রিয় = 1 ব্যবহারকারীর একটি গণনা পেতে চাই এবং কেবল ক্লায়েন্টের একটি গণনা পেতে চাই।

আপনি "কেবল শক্ত কোড এটি" বলার আগে এটি এমন একটি ক্যোয়ারী যা অজগর স্ক্রিপ্টের ভিতরে চলে যা যা বিভিন্ন বিভিন্ন ডাটাবেসে চালানো যেতে পারে এবং আমার স্ক্রিপ্টটি কোন টেবিলগুলি নির্বাচন করবে এবং সেগুলির কাছে যদি একটি কলাম বলে থাকে তবে আমার জানার উপায় নেই activeand আমি দুটি আলাদা আলাদা পরিবর্তে এটি করার জন্য এবং একটি ত্রুটি নিক্ষেপ করতে মাইএসকিএলে ভরসা করার জন্য কেবল একটি ক্যোয়ারী পছন্দ করি যাতে আমি অন্যটিটি ব্যবহার করতে জানি know


ব্যবহারকারীর মধ্যে এমন এক ক্লায়েন্টেড রয়েছে যা একটি ক্লায়েন্টকে উল্লেখ করে
ম্যাট এস

উত্তর:


50

আমার প্রথম চিন্তাটি প্রথমটি ব্যবহার করা হবে INFORMATION_SCHEMA, সুতরাং আপনি জানতে পারবেন (মাইএসকিউএল উদাহরণে সমস্ত টেবিলের জন্য একটি ক্যোয়ারিতে) কোন টেবিলগুলির একটি activeকলাম রয়েছে এবং তারপরে আপনার প্রশ্নগুলি তৈরি করতে সেই তথ্যটি ব্যবহার করুন। এবং এটি সম্ভবত সবচেয়ে বুদ্ধিমান পন্থা।

আর একটিরও জটিল উপায় আছে যদিও এটি সারণীতে যেমন একটি কলাম রয়েছে বা না তা কার্যকর নয়:

SELECT 
  ( SELECT COUNT(*)
    FROM TableName AS t
    WHERE active = 1
  ) AS cnt
FROM
  ( SELECT 1 AS active
  ) AS dummy ;

এটি কীভাবে কাজ করে তা এসকিউএল-ফিডলে পরীক্ষা করা হয়েছে ?

যদি টেবিলটির একটি কলামের নাম থাকে activeতবে ক্যোয়ারীটিকে "অনুবাদ" করে দেওয়া হয়েছে যেন তা রয়েছে:

    WHERE t.active = 1

যদি টেবিলটির নামকরণ করা কোনও কলাম না থাকে activeতবে ক্যোয়ারীটিকে "অনুবাদ" করা হয়েছে যেমন এটি রয়েছে:

    WHERE dummy.active = 1         -- which is true 

3

কেবলমাত্র usersটেবিলটি ব্যবহার করে গ্র্যান্ড টোটাল সহ ব্যবহারকারী প্রতি ক্লায়েন্টের গণনা :

SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(u.clientid) ClientCount
FROM users u
WHERE u.active = 1
GROUP BY u.id WITH ROLLUP;

যদি ক্লায়েন্ট টেবিলটি রেকর্ডগুলি মুছে ফেলেছে, তবে এটি করুন:

SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(c.id) ClientCount
FROM users u INNER JOIN clients c
ON u.clientid = c.id
WHERE u.active = 1
GROUP BY u.id WITH ROLLUP;

usersটেবিলগুলির জন্য যেগুলির কোনও activeকলাম নেই:

SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(u.clientid) ClientCount
FROM users u
GROUP BY u.id WITH ROLLUP;

অথবা

SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(c.id) ClientCount
FROM users u INNER JOIN clients c
ON u.clientid = c.id
GROUP BY u.id WITH ROLLUP;

প্রতিটি ডাটাবেস এবং UNION ALLফলাফলের বিরুদ্ধে আপনাকে এই প্রশ্নগুলি চালানো দরকার ।

আপনি যদি INFORMATION_SCHEMA ডাটাবেসটি ব্যবহার করতে চান তবে এখানে একটি বুনো অনুমান দেওয়া আছে:

SELECT COUNT(1) INTO @hasactive
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'users'
AND column_name = 'active';
SELECT
    IFNULL(u.id,'Total') UserID,
    COUNT(u.clientid) ClientCount
FROM users u
WHERE IF(@hasactive=1,u.active=1,1)=1
GROUP BY u.id WITH ROLLUP;

একবার চেষ্টা করে দেখো !!!


1

আমি @ ypercubeᵀᴹ এর উত্তর পরিপূরক করতে চাই, তবে বিধিনিষেধের কারণে আমি মন্তব্য লিখতে পারি না।

কোন কলাম নামটি ব্যবহার করা হয় তা যদি আপনি না জানেন এবং এর সর্বাধিক মান পাওয়া দরকার তবে আপনি এটি করতে পারেন:

SELECT
    ( SELECT
          max(ISNULL(updateTime, null)) + max(ISNULL(updDT, null))
          FROM tableName as t
    ) AS maxUpdateDT
FROM (SELECT 0 AS updateTime, 0 as updDT) AS dummy;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.