एक उपकेंद्र से पंक्तियों की गिनती


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;

उपकुंजी को तुरंत FROM कीवर्ड का पालन करना चाहिए। (MySQL में इस तरह की एक उपश्रेणी के लिए एक नाम निर्दिष्ट करना भी अनिवार्य है (इसे वास्तव में एक व्युत्पन्न तालिका कहा जाता है ), जिसके कारण आप AS some_nameइसे निम्न देख सकते हैं ।) जिस तरह से आपने इसे लिखा है, MySQL आपकी स्क्रिप्ट की व्याख्या करता है। दो स्वतंत्र प्रश्न, यही कारण है कि आपको दो परिणाम सेट मिल रहे हैं।

इसलिए, चूंकि आपके मामले में मातहत है

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 फ़ंक्शन तालिका ip_addressमें केवल भिन्न घटनाओं की गणना करेगा ports


FY: पोस्टग्रैस 10 में भी ठीक काम किया: SELECT COUNT(*) FROM (select * from bme_wk_umatch_ug where rdbname = 'xxx) as tocount; मुझे ओपीएस मूल अवधारणा का उपयोग करना पड़ा क्योंकि मैं एक इंटरस्क्यूरी सबक्वेरी में पंक्तियों की गिनती करने जा रहा हूं।
JL Peyret

6

आप स्थानांतरित करना होगा DISTINCTकरने के लिए COUNT():

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

यह लौटाता है 5क्योंकि यह केवल अलग-अलग मानों को गिनता है और उप-वर्ग की अब और आवश्यकता नहीं है।

हालाँकि यह क्वेरी वापस आती है 17क्योंकि portsतालिका में 17 पंक्तियाँ हैं :

SELECT COUNT(ip_address) FROM `ports`;

इस SQL Fiddle देखें ।

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');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.