2010-09-01 15 views
69

निम्नलिखित MySQL तालिका के साथ: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 तो कर सकते हैं PHP में पंक्तियों की गणना, लेकिन यह सिर्फ एक ही पंक्ति के लिए एक संभावित बड़े resultset लोड करने के लिए बेकार लगता है।

+0

http://stackoverflow.com/questions/2520357/mysql-get-row-number-on- चयन करें –

+0

[MySQL का संभावित डुप्लिकेट - पंक्ति संख्या प्राप्त करें चयन करें] (http://stackoverflow.com/questions/2520357/mysql-get-row-number-on-select) – jberryman

उत्तर

98

उपयोग इस की जरूरत है। यह:

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 को दूसरी स्थिति देगी ...

+3

निष्पादित करने पर विचार कर सकते हैं? – actual

+0

@actual: कहने के लिए कुछ भी नहीं है - विश्लेषक कार्यों (पोस्टग्रेएसक्यूएल, ओरेकल, एसक्यूएल सर्वर, डीबी 2 ...) –

+2

@OMGPonies का समर्थन करने वाले प्रतिद्वंद्वी के पास जाने के अलावा कोई विकल्प नहीं है, बस 'स्थिति' के बाद एक अल्पविराम भूल जाएं, लेकिन यह है उत्तम। – pierallard

16

यही एक रास्ता है कि मुझे लगता है कि कर सकते हैं की है:

SELECT `id`, 
     (SELECT COUNT(*) FROM `table` WHERE `name` <= 'Beta') AS `position`, 
     `name` 
FROM `table` 
WHERE `name` = 'Beta' 
+1

+1 अच्छी चाल ... हालांकि आप शायद 'name <=' बीटा 'का उपयोग करना चाहते हैं ' –

+0

हां, सुधार – zerkms

+0

के लिए धन्यवाद यह दृष्टिकोण संबंधों के लिए समान 'स्थिति' मान देगा। –

-7

हो सकता है कि तुम क्या जरूरत है ऐड वाक्य रचना के साथ है

LIMIT में

तो

SELECT * FROM tbl ORDER BY name ASC LIMIT 1 
का उपयोग

अगर

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' 

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

+0

आपने पोस्ट को गलत तरीके से पढ़ा है। वह चाहता है कि सेट – Navarr

+0

में पंक्तियों की स्थिति है, यह उत्तर यहां समस्या का समाधान नहीं करता है। आप इसे –

6

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

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

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

क्वेरी 1:

SELECT * FROM tbl WHERE name = 'Beta'

क्वेरी 2:

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

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

0

तालिका में एक पंक्ति की स्थिति दर्शाती है कि लक्षित पंक्ति से कितनी पंक्तियां "बेहतर" हैं।

तो, आपको उन पंक्तियों को गिनना होगा।

COUNT का चयन करें (*) + 1 table से कहां name < 'बीटा'

एक टाई के मामले में, उच्चतम स्थिति दिया जाता है।

यदि आप मौजूदा "बीटा" पंक्ति के बाद "बीटा" के समान नाम के साथ एक और पंक्ति जोड़ते हैं, तो वापस लौटाई गई स्थिति अभी भी 2 होगी, क्योंकि वे वर्गीकरण में एक ही स्थान साझा करेंगे।

आशा है कि इससे लोगों को मदद मिलेगी जो भविष्य में कुछ इसी तरह की खोज करेंगे, क्योंकि मेरा मानना ​​है कि प्रश्न मालिक ने पहले ही अपना मुद्दा हल कर लिया है।

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 
+0

यह उत्तर स्वीकार किए गए व्यक्ति से समझना आसान था। +1 – Eric