2010-02-12 10 views
5

यह सवाल एक छोटे से इतिहास — Is there a way to make a query respect the order of the inputted parameters?पोस्टग्रेएसक्यूएल इनपुट पैरामीटर के आदेश का सम्मान करते हैं?

मैं निर्माण "विशेष" क्वेरी के लिए नया हूँ है, तो मैं मान लिया है कि अगर मैं एक SELECT क्वेरी में एक IN खंड की आपूर्ति, यह एक ही में परिणाम लौटाता है आदेश। दुर्भाग्य से यह मामला नहीं है।

SELECT * FROM artists WHERE id IN (8, 1, 2, 15, 14, 3, 13, 31, 16, 5, 4, 7, 32, 9, 37) 
>>> [7, 32, 3, 8, 4, 2, 31, 9, 37, 13, 16, 1, 5, 15, 14] 

(कदम जहाँ मैं परिणाम लूप करने के लिए अजगर का इस्तेमाल किया शामिल हैं और एक सूची को आईडी संलग्न नहीं किया था।)

तो सवाल है, वहाँ Postgres का सम्मान करने के लिए एक रास्ता है समान ऑर्डर देने के परिणामस्वरूप IN खंड में दिए गए पैरामीटर का ऑर्डरिंग?

उत्तर

5

क्वेरी परिणाम गैर-निर्धारिती क्रम में वापस नहीं लौटाएंगे जबतक कि आप ORDER BY खंड निर्दिष्ट नहीं करते हैं।

यदि आप वास्तव में जिस तरीके से अनुरोध कर रहे हैं उसमें क्वेरी करना चाहते हैं, तो आप इस तरह के एक खंड का निर्माण कर सकते हैं। यहां आपके डेटा के हिस्से का उपयोग करके एक उदाहरण दिया गया है।

create table artists (
id integer not null primary key, 
name char(1) not null); 

insert into artists 
values 
    (8, 'a'), 
    (1, 'b'), 
    (2, 'c'), 
    (15, 'd'), 
    (14, 'e'), 
    (3, 'f'), 
    (13, 'g'); 

select * 
from artists 
where id in (8, 1, 2, 15, 14, 3, 13) 
order by 
    id = 8 desc, 
    id = 1 desc, 
    id = 2 desc, 
    id = 15 desc, 
    id = 14 desc, 
    id = 3 desc, 
    id = 13 desc; 

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

यदि आपके पास कलाकार और रैंकिंग टेबल हैं, तो आपको ऐसा कुछ करने में सक्षम होना चाहिए (या आपके ओआरएम के बराबर)।

select 
    a.* 
from 
    artists a, 
    rankings r 
where 
    a.id = r.artist_id 
order by 
    r.score desc; 
+0

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

+0

बहुत दुखी है कि पोस्टग्रेस आदेश को सुरक्षित नहीं रख सकता है। यह मुझे कई परेशानियों से भी बचाएगा! मैं एक समान स्थिति में हूं और सॉर्ट ऑर्डर प्रति मिनट कई बार बदलता है, इसलिए मैं पूरी तरह से अनावश्यक डेटाबेस लिखने से रोकने के लिए अपने ऐप में ऑर्डर कर रहा हूं। तो आदेश एक विकल्प नहीं है, – Malte

2

मैं तुम्हें PostgreSQL किसी भी मनमाने ढंग से आदेश (विशेष रूप से, क्योंकि यह एक Django इंटरफ़ेस से सुक्ष्म एसक्यूएल स्तरीय नियंत्रण करने के लिए मुश्किल है), तो रास्ते में यह सॉर्ट आप अजगर में इच्छा में सेट लौट जाने का सुझाव - theresultset.sort(key=yourlistofids.index) ठीक करना चाहिए (जब theresultset डेटाबेस से उत्पन्न मनमाने ढंग से ऑर्डर सूची है और yourlistofids वह सूची है जिसका ऑर्डर आप संरक्षित करना चाहते हैं)।

+0

एक और स्थिति जहां मैं चाहता हूं कि मैं दोनों उत्तरों को स्वीकार कर सकूं। :) बहुत बहुत धन्यवाद, मैं व्यक्तिगत रूप से इस मार्ग को लेने जा रहा हूं, लेकिन Google के इस प्रश्न को ढूंढने वाले लोगों के हित के लिए, मैं सामना करने का जवाब स्वीकार करने जा रहा हूं। –

+0

एफडब्ल्यूआईडब्ल्यू, मैं इस समाधान के खिलाफ सिफारिश करता हूं। डेटाबेस को सॉर्ट करने के लिए डिज़ाइन किया गया है, जबकि ऐप भाषा नहीं है। डेटाबेस प्रकार को देने से यह धीमा हो जाएगा। – theory

+0

@ थ्योरी, पायथन ** शानदार ** सॉर्टिंग (डेटा जो स्मृति में फिट बैठता है) पर है - इसका 'टाइम्सॉर्ट' एल्गोरिदम इतना शानदार है कि यह भी अधिक ध्यान आकर्षित करता है उदा। जावा दुनिया में। यह कहना आपके लिए बेतुका है कि (पायथन) "ऐसा नहीं है" "सॉर्टिंग करने के लिए डिज़ाइन किया गया" जब यह इतना * महान * है। –

0

एक और तरीका है:

SELECT * 
FROM artists 
WHERE id IN (8, 1, 2, 15, 14, 3, 13, 31, 16, 5, 4, 7, 32, 9, 37) 
ORDER BY POSITION(id::text in '(8, 1, 2, 15, 14, 3, 13, 31, 16, 5, 4, 7, 32, 9, 37)'); 
+0

स्थिति फ़ंक्शन किसी अन्य स्ट्रिंग में एक स्ट्रिंग की स्थिति निर्धारित करता है। यह ठीक से काम नहीं करेगा क्योंकि सभी आईडी एक ही संख्या में अंक नहीं हैं। मान लीजिए कि आप आईडी 14 पहले बनना चाहते थे। आप पहले आईडी 1 के साथ समाप्त हो सकता है। या आईडी 4। –

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