2011-02-08 12 views
7
SELECT f.* 
FROM feeds f, 
    user_feeds uf 
WHERE (f.id=uf.feed_id and uf.user_id in (1,2,5,6,23,45)) 
ORDER BY created_at DESC 

की अधिकतम लंबाई उपयोगकर्ता की फ़ीड्स बनाने के लिए उपयोग की जाने वाली एक क्वेरी है। मेरे पास इस प्रश्न के साथ समस्या यह है कि "uf.user_id इन()" बढ़ता है जो उपयोगकर्ताओं की संख्या में वृद्धि करता है।एक SQL क्वेरी

SQL क्वेरी की अधिकतम अधिकतम लंबाई क्या है? क्या मेरी उपरोक्त क्वेरी को लागू करने का कोई बेहतर तरीका है?

नोट: मैं ActiveRecord का उपयोग कर रहा हूं। और मैं पोस्टग्रेस का उपयोग कर रहा हूं।

+0

मुझे लगता है कि आपको "फ़ीड्स", "user_feeds" क्या है, और "वह" कौन है, इसकी व्याख्या करने की आवश्यकता है। क्या ब्याज की कोई अन्य तालिका है? क्या उपयोगकर्ता आईडी 1, 2, 5, आदि एक टेबल में संग्रहीत हैं? – ChrisJ

+0

फ़ीड: आईडी, user_feeds feed_type: [| टिप्पणी | आदि] अनिवार्य रूप से, जब कोई कुछ (जैसे कि एक तस्वीर) पसंद करती है एक प्रविष्टि में किया जाता है आईडी, उपयोगकर्ता नाम feed_type =: आईडी, FEED_ID, उपयोगकर्ताओं user_id "फ़ीड्स" तालिका, और प्रविष्टियों को फोटो में शामिल उपयोगकर्ताओं की user_feeds तालिका में बनाया जाता है। हां 1,2,5 ... उपयोगकर्ता आईडी –

उत्तर

11

पोस्टग्रेएसक्यूएल प्रक्रिया कर सकते हैं की एक क्वेरी की अधिकतम लंबाई 2147483648 वर्ण (हस्ताक्षर 4-बाइट पूर्णांक; src/include/lib/stringinfo.h देखें)।

4

क्वेरी आकार से बचने के लिए, आप आईएन (1, 2) को IN के साथ प्रतिस्थापित कर सकते हैं (फ़ॉलो फ़ॉलोइंग_आईडी को फ़ॉलो करें जहां follower_id =?) या अनुयायियों के बाद के उपयोगकर्ताओं के आईडी को ढूंढने के लिए उचित क्वेरी होगी आईडी।

+0

आह हैं, यह लिखने का एक आसान तरीका है। –

1

आप अपने मूल WHERE खंड के IN हिस्से को बनाने के लिए एक सबक्वायरी का उपयोग करने पर विचार कर सकते हैं। तो नतीजा इस तरह कुछ दिखाई देगा:

"फ़ील्ड एफ से, एफ फ़ीड करें, उपयोगकर्ता_फेड्स uf जहां (f.id = uf.feed_id और uf.user_id (चयन करें जहां अनुयायी = आईडी)) बनाया गया है डीईएससी "

स्पष्ट रूप से सबकुरी सही नहीं है जैसा मैंने पोस्ट किया है, लेकिन इससे आपको सामान्य विचार देना चाहिए।

+0

हां। धन्यवाद, मुझे लगता है कि मैं ऐसा करूँगा। –

0

एक सहसंबंधित उप-क्वेरी का उपयोग करें। यदि आपके पास एक सारणी है जो उपयोगकर्ताओं को रखती है तो सदस्य आपके प्रश्न टेक्स्ट का पालन नहीं करेगा।

उदाहरण के लिए:

SELECT f.* 
FROM feeds f, 
    user_feeds uf 
WHERE f.id=uf.feed_id 
    AND EXISTS (SELECT 'X' 
       FROM follows 
       WHERE follows.user_id = uf.user_id) 
ORDER BY created_at DESC; 
0

जब कोई (वास्तविक) क्वेरी स्ट्रिंग की लंबाई पर सीमा नहीं है, वहाँ में (एक्स, वाई, जेड ...) खंड की संख्या पर कोई सीमा है : 10000, postgres.ini-फाइल में विन्यास:

देखें: http://grokbase.com/t/postgresql/pgsql-general/061mc7pxg6/what-is-the-maximum-length-of-an-in-a-b-c-d-list-in-postgresql: "। 7.4 में और इससे पहले यह max_expr_depth सेटिंग पर निर्भर"

... "8.0 में और बाद में max_expr_depth चला गया है और सीमा max_stack_depth पर निर्भर करती है।"

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