একটি subquery থেকে সারি গণনা


14

সরল: আমি সাব-কোয়েরি থেকে সারিগুলির সংখ্যা গণনা করতে চাই। মনে রাখবেন যে হোস্টটি অনলাইনে আছে কিনা তা স্থিতিটি

খারাপ কোড

SELECT COUNT(ip_address) FROM `ports` (
    SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
)

ব্যাখ্যা

প্রথম ক্যোয়ারী, যখন তার নিজের দ্বারা চালিত হয় এটি এ:

SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
ip_address  
192.168.1.1
192.168.1.2
192.168.1.248
192.168.1.251
192.168.1.254

নিজস্ব অনুসন্ধানে চালিত দ্বিতীয় ক্যোয়ারী এটি ফেরত দেয়:

SELECT COUNT(ip_address) FROM `ports`
17

প্রশ্ন

আমি কীভাবে 5 আইপি ঠিকানার তালিকাটি গণনা করব তা জানতে চাই।

আমি এই সাধারণ সমস্যার সম্ভাব্য সমাধানগুলি অনলাইনে দেখছি এবং হতাশ হয়ে পড়েছি, তাই ভেবেছিলাম বিশেষজ্ঞদের জিজ্ঞাসা করব।

উত্তর:


18

আপনার তাত্ক্ষণিক প্রশ্নের উত্তর দেওয়ার জন্য, কীভাবে সাবকিউয়ের সারিগুলি গণনা করতে হবে, সিনট্যাক্সটি নিম্নরূপ:

SELECT COUNT(*) FROM (subquery) AS some_name;

Subquery অবিলম্বে FROM কীওয়ার্ড অনুসরণ করা উচিত। (মাইএসকিউএলে এই ধরণের একটি সাবকোরিতে একটি নাম নির্ধারণ করাও বাধ্যতামূলক (এটিকে আসলে একটি উত্পন্ন টেবিল বলা হয় ), যার কারণে আপনি এটি AS some_nameনিম্নলিখিতটি দেখতে পারেন )) আপনি যেভাবে এটি লিখেছেন, মাইএসকিউএল আপনার স্ক্রিপ্টটিকে ব্যাখ্যা করে দুটি স্বতন্ত্র প্রশ্ন, এ কারণেই আপনি দুটি ফলাফল সেট পাচ্ছেন।

সুতরাং, যেহেতু আপনার ক্ষেত্রে সাবকোয়ারি

SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE

সম্পূর্ণ ক্যোয়ারী এটির মতো দেখাবে:

SELECT COUNT(*) FROM (
    SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
) AS derived;

কিন্তু, জুলিয়েন যেমন পরামর্শ দিয়েছেন , আপনি নিজের ক্যোয়ারীটি ঠিক এভাবেই আবার লিখতে পারেন:

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

এই ভাবে আপনি কারণ COUNT টি ফাংশন শুধুমাত্র স্বতন্ত্র ঘটনার গণনা করা হবে, সব সময়ে একটি subquery / উদ্ভূত টেবিল প্রয়োজন হবে না ip_addressযে portsটেবিল।


এফওয়াইয়ার: পোস্টগ্র্রেস 10 তেও ঠিক কাজ করেছে: SELECT COUNT(*) FROM (select * from bme_wk_umatch_ug where rdbname = 'xxx) as tocount; আমাকে ওপিএসের মূল ধারণাটি ব্যবহার করতে হয়েছিল কারণ আমি ইন্টারস্যাক্ট সাবকোয়্যারিতে সারিগুলি গণনা করতে চলেছি।
জে এল পেয়ারেট

6

আপনাকে অবশ্যই এতে স্থানান্তরিত DISTINCTকরুন COUNT():

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

এটি প্রত্যাবর্তন করে 5কারণ এটি কেবল স্বতন্ত্র মান গণনা করে এবং সাবকোয়ারির আর প্রয়োজন হয় না।

তবে এই কোয়েরিটি ফিরে আসে 17কারণ portsসারণীতে 17 টি সারি রয়েছে:

SELECT COUNT(ip_address) FROM `ports`;

এই এসকিউএল ফিডলটি দেখুন

17 সারি এবং 5 স্বতন্ত্র আইপি সহ নমুনা ডেটা:

CREATE TABLE ports (ip_address varchar(20));

INSERT INTO `ports`(ip_address) VALUES
  ('192.168.1.1')
  , ('192.168.1.1')
  , ('192.168.1.1')
  , ('192.168.1.2')
  , ('192.168.1.2')
  , ('192.168.1.2')
  , ('192.168.1.2')
  , ('192.168.1.248')
  , ('192.168.1.248')
  , ('192.168.1.248')
  , ('192.168.1.248')
  , ('192.168.1.251')
  , ('192.168.1.251')
  , ('192.168.1.251')
  , ('192.168.1.254')
  , ('192.168.1.254')
  , ('192.168.1.254');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.