MySQL द्वारा ऑर्डर में पंक्ति स्थिति प्राप्त करें




analytic-functions (4)

इसे इस्तेमाल करो:

SELECT x.id, 
       x.position,
       x.name
  FROM (SELECT t.id,
               t.name,
               @rownum := @rownum + 1 AS position
          FROM TABLE t
          JOIN (SELECT @rownum := 0) r
      ORDER BY t.name) x
 WHERE x.name = 'Beta'

... एक अद्वितीय स्थिति मूल्य प्राप्त करने के लिए। इस:

SELECT t.id,
       (SELECT COUNT(*)
          FROM TABLE x
         WHERE x.name <= t.name) AS position
       t.name    
  FROM TABLE t      
 WHERE t.name = 'Beta'

... एक ही मूल्य संबंधों को दे देंगे। आईई: यदि दूसरे स्थान पर दो मान हैं, तो दोनों की स्थिति 2 होगी जब पहली क्वेरी उनमें से 2 में से एक की स्थिति देगी, और 3 अन्य ...

निम्नलिखित MySQL तालिका के साथ:

+-----------------------------+
+ id INT UNSIGNED             +
+ name VARCHAR(100)           +
+-----------------------------+

name ASC सॉर्ट करते समय, तालिका में अन्य पंक्तियों के बीच मैं एक पंक्ति और उसकी स्थिति का चयन कैसे कर सकता हूं। तो अगर तालिका डेटा इस तरह दिखता है, जब नाम से क्रमबद्ध किया जाता है:

+-----------------------------+
+ id | name                   +
+-----------------------------+
+  5 | Alpha                  +
+  7 | Beta                   +
+  3 | Delta                  +
+ .....                       +
+  1 | Zed                    +
+-----------------------------+

मैं उस पंक्ति की वर्तमान स्थिति प्राप्त करने वाली Beta पंक्ति का चयन कैसे कर सकता हूं? परिणाम सेट जो मैं ढूंढ रहा हूं वह ऐसा कुछ होगा:

+-----------------------------+
+ id | position | name        +
+-----------------------------+
+  7 |        2 | Beta        +
+-----------------------------+

मैं SELECT * FROM tbl ORDER BY name ASC एक साधारण SELECT * FROM tbl ORDER BY name ASC कर सकता हूं, फिर PHP में पंक्तियों का आकलन करें, लेकिन यह केवल एक पंक्ति के लिए संभावित रूप से बड़े परिणाम को लोड करने के लिए अपर्याप्त लगता है।


जो भी आपको चाहिए सिंटैक्स के साथ हो सकता है

आप LIMIT

तो उपयोग करें

SELECT * FROM tbl ORDER BY name ASC LIMIT 1

अगर आपको सिर्फ एक पंक्ति की जरूरत है ..


मुझे एक बहुत ही समान मुद्दा मिला है, यही कारण है कि मैं एक ही सवाल नहीं पूछूंगा, लेकिन मैं यहां साझा करूंगा कि मैंने क्या किया, मुझे एवीजी द्वारा एक समूह का उपयोग करना और आदेश देना पड़ा। वहां हस्ताक्षर और समाज के साथ छात्र हैं, और मुझे उन्हें रैंक करना था (दूसरे शब्दों में, मैंने पहले एवीजी को कैलक किया था, फिर उन्हें डीईएससी में ऑर्डर किया था, और अंततः मुझे स्थिति (मेरे लिए रैंक) जोड़ने की ज़रूरत थी, इसलिए मैंने किया कुछ मेरी सबसे अच्छी प्रतिक्रिया के समान है, मेरी समस्या में समायोजित कुछ बदलावों के साथ):

मैंने बाहरी चयन में अंततः position (मेरे लिए रैंक) कॉलम डाल दिया

SET @rank=0;
SELECT @rank := @rank + 1 AS ranking, t.avg, t.name
  FROM(SELECT avg(students_signatures.score) as avg, students.name as name
FROM alumnos_materia
JOIN (SELECT @rownum := 0) r
left JOIN students ON students.id=students_signatures.id_student
GROUP BY students.name order by avg DESC) t 

यदि क्वेरी सरल है और लौटा परिणाम सेट का आकार संभावित रूप से बड़ा है, तो आप इसे दो प्रश्नों में विभाजित करने का प्रयास कर सकते हैं।

केवल उस पंक्ति के डेटा को पुनर्प्राप्त करने के लिए एक संकीर्ण-डाउन फ़िल्टरिंग मानदंड वाली पहली क्वेरी, और दूसरी क्वेरी स्थिति की गणना करने के लिए WHERE क्लॉज के साथ COUNT का उपयोग करती है।

उदाहरण के लिए आपके मामले में

प्रश्न 1:

SELECT * FROM tbl WHERE name = 'Beta'

प्रश्न 2:

SELECT COUNT(1) FROM tbl WHERE name >= 'Beta'

हम 2 एम रिकॉर्ड के साथ एक तालिका में इस दृष्टिकोण का उपयोग करते हैं और यह ओएमजी पोनी के दृष्टिकोण से अधिक स्केलेबल है।





analytic-functions