2009-03-23 14 views
5

MySQLसीमित, मनमाने ढंग से आदेशित रिकॉर्ड सेट में एक रिकॉर्ड के * स्थिति * को कैसे ढूंढें?

आप कुछ आईडी के आधार पर बस एक ही रिकॉर्ड प्राप्त करना चाहते हैं मान लीजिए, लेकिन आप को पता है कि अपनी स्थिति को अगर आप में एक बड़ी सेट का आदेश दिया यह का सामना करना पड़ा था हो गया होता चाहते हैं।

मामले में मामला एक फोटो गैलरी है। आप एक ही तस्वीर पर उतरते हैं, लेकिन सिस्टम को पता होना चाहिए कि संपूर्ण गैलरी में इसका ऑफसेट क्या है।

मुझे लगता है कि मैं पदों का ट्रैक रखने के लिए कस्टम इंडेक्सिंग फ़ील्ड का उपयोग कर सकता हूं, लेकिन अकेले एसक्यूएल में एक और अधिक शानदार तरीका होना चाहिए।

+0

ऐसा करने का कोई एएनएसआई तरीका उपलब्ध नहीं है। यदि आप बता सकते हैं कि आप किस डीबी सर्वर का उपयोग कर रहे हैं तो हम मदद कर सकते हैं। इसे जोड़ने के लिए अपना प्रश्न संपादित करें। – Seb

+0

आह हाँ .. MySQL .. माफ करना भूल गया कि थोड़ा –

+0

आप ऐसा क्यों करना चाहते हैं? थोड़ी स्पष्ट करें - क्योंकि आपको दिखाने की स्थिति की आवश्यकता नहीं है, कहें, पिछली और अगली तस्वीरें ... आदि –

उत्तर

2

तो, सबसे पहले आप अपनी ऑर्डर द्वारा जो भी ऑर्डर करते हैं, उसके द्वारा क्रमशः स्थिति # के साथ वर्चुअल टेबल बनाते हैं, तो आप उस सेट से उच्चतम का चयन करते हैं। अधिक परिणाम सेट में यह स्थिति है। यदि आप किसी अद्वितीय मान/मूल्यों के सेट द्वारा ऑर्डर नहीं करते हैं तो आप समस्याओं में भाग सकते हैं ...

यदि आप (photo_gallery_id, date_created_on) पर एक अनुक्रमणिका बनाते हैं तो यह एक इंडेक्स स्कैन कर सकता है (फ़ोटो के वितरण के आधार पर), जो एक टेबल स्कैन से तेज़ होना चाहिए (बशर्ते आपकी गैलरी_आईडी 9 0% फोटो या व्हाट्नॉट न हो)।

SELECT @row := 0; 
SELECT MAX(position) 
    FROM (SELECT @row := @row + 1 AS position 
      FROM photos 
      WHERE photo_gallery_id = 43 
      AND date_created_on <= 'the-date-time-your-photo-was' 
      ORDER BY date_created_on) positions; 
+0

मुझे इस वर्चुअल टेबल तकनीक के बारे में पता नहीं था .. धन्यवाद –

0

वास्तव में नहीं। मुझे लगता है कि ओरेकल आपको "ROWID" या ऐसा कुछ देता है, लेकिन अधिकांश आपको एक नहीं देते हैं। आपके डेटाबेस में एक कॉलम की तरह एक कस्टम ऑर्डरिंग, जो आपको बताती है कि गैलरी में प्रविष्टि की स्थिति अच्छी है क्योंकि आप कभी भी यह सुनिश्चित नहीं कर सकते कि एसक्यूएल टेबल में चीजों को उस क्रम में रखेगा जो आपको लगता है कि वे अंदर होना चाहिए।

0

आप का उपयोग आप क्या डेटाबेस का उपयोग कर रहे SQL सर्वर 2005 में, के बारे में विशिष्ट नहीं हैं सकता है

SELECT 
    ROW_NUMBER() OVER (ORDER BY PhotoID) 
    , PhotoID 
FROM dbo.Photos 
0

आप कहते हैं कि नहीं है कि तुम क्या DBMS उपयोग कर रहे हैं, और "समाधान" तदनुसार अलग अलग होंगे। ओरेकल में आप ऐसा कर सकता है (लेकिन मैं आपको नहीं आग्रह करता हूँ!):

select photo, offset 
from 
(select photo 
    ,  row_number() over (partition by gallery_id, order by photo_seq) as offset 
    from photos 
) 
where id = 123 

कि क्वेरी सभी तस्वीरें (पूर्ण तालिका स्कैन) चयन करें और फिर भी आप के लिए कहा बाहर ले जाएगा - नहीं एक कलाकार पूछताछ!

मैं सुझाव दूंगा कि क्या आपको वास्तव में की आवश्यकता है, यह जानकारी संग्रहीत की जानी चाहिए।

0

स्थिति आईडी के द्वारा ही निर्धारित किया जाता है मान लिया जाये कि, यह मुझे यकीन है कि नहीं कर रहा हूँ एक छोटे आईडी मान ?:

select 
    po.[id] 
    ... 
    ((select count(pi.[id]) from photos pi where pi.[id] < po.[id]) + 1) as index 
    ... 
from photos po 
... 

साथ सभी रिकॉर्ड गिनती के रूप में सरल नहीं होगा क्या एक ऐसे के प्रदर्शन निहितार्थ पूछताछ होगी, लेकिन मुझे लगता है कि बहुत सारे रिकॉर्ड लौटने में समस्या हो सकती है।

+0

नहीं, ऑर्डरिंग मनमाने ढंग से है। –

0

आपको "एप्लिकेशन कुंजी" और "तकनीकी कुंजी" के बीच का अंतर समझना होगा।

तकनीकी कुंजी एक आइटम को अद्वितीय बनाने के एकमात्र उद्देश्य के लिए मौजूद है। यह आमतौर पर इंटेगर या बिगिनट में उत्पन्न होता है, उत्पन्न (पहचान, जो कुछ भी)। इस कुंजी का उपयोग डेटाबेस में ऑब्जेक्ट्स का पता लगाने के लिए किया जाता है, किसी ऑब्जेक्ट से जल्दी से पता चला है कि पहले से ही जारी रखा गया है (आईडी होना चाहिए> 0, इसलिए डिफ़ॉल्ट आईडी == 0 वाला ऑब्जेक्ट डीबी में नहीं है), आदि

एप्लिकेशन कुंजी ऐसा कुछ है जिसे आपको अपने आवेदन के संदर्भ में किसी ऑब्जेक्ट को समझने की आवश्यकता है। इस मामले में, यह गैलरी में तस्वीरों का ऑर्डरिंग है। इसका डेटाबेस के लिए कोई मतलब नहीं है।

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

तो आपको क्या करना चाहिए एक इंडेक्स पंक्ति जोड़ें (यानी एक इंटेग्रर जो कहता है कि आपकी छवि गैलरी में कौन सी स्थिति है, त्वरित पहुंच के लिए डेटाबेस इंडेक्स नहीं है, भले ही आपको इस कॉलम पर एक इंडेक्स बनाना चाहिए .. ।) और इसे बनाए रखें। प्रत्येक सम्मिलन के लिए, आपको UPDATE index = index + 1 where index >= insertion_point, आदि

हां, यह बेकार है। एकमात्र समाधान जो मुझे पता है: एक ओआरएम फ्रेमवर्क का उपयोग करें जो आपके लिए यह हल करता है।

+0

ठीक है, इसलिए कस्टम इंडेक्स को बनाए रखना आप जो सुझाव दे रहे हैं। जैसा कि आप चूसते हैं, यह करता है। विशेष रूप से इस इंडेक्स को रीफ्रेश करना अक्सर संभव होगा क्योंकि संभावित ऑर्डरिंग में से एक उपयोगकर्ता की रेटिंग –

+0

याद रखें: आपके पास केवल एक तकनीकी कुंजी (आमतौर पर प्राथमिक कुंजी) हो सकती है लेकिन आपके पास कई एप्लिकेशन कुंजियां हो सकती हैं (और ORDER BY का उपयोग करें उनके द्वारा क्रमबद्ध करें)। तो आप एक रिंग कॉलम करके इस सॉर्टिंग को कार्यान्वित कर सकते हैं। –

0

अतिरिक्त टेबल की आवश्यकता नहीं है, क्यों न केवल रिकॉर्ड की गणना करें?

आप जानते हैं कि वे किस क्रम में प्रदर्शित होते हैं (जो भिन्न हो सकते हैं), लेकिन आप इसे जानते हैं।

आप वर्तमान रिकॉर्ड की आईडी भी जानते हैं; आइए मान लें कि तिथि पर आदेश दिया गया है:

रिकॉर्ड ऑफसेट, उस तिथि < की तारीख के साथ गिने गए रिकॉर्ड की कुल संख्या है।

SELECT COUNT(1) FROM ... WHERE date < "the-date" 

यह आपको नंबर पर आप के रूप में अन्य प्रश्नों के लिए ऑफसेट का उपयोग कर सकते देता है ...

संबंधित मुद्दे