2009-06-30 10 views
14

पर मेरे पास यह क्वेरी है जो MySQL में सही तरीके से काम करती है। here पर अधिक पृष्ठभूमि।MySQL को कनवर्ट करना PostgreSQL

SELECT c.*, SUM(ABS(v.vote)) AS score 
FROM categories c,items i, votes v 
    WHERE c.id = i.category_id 
    AND i.id = v.voteable_id 
    AND v.created_at > '#{1.week.ago}' 
GROUP BY c.id 
ORDER BY score DESC LIMIT 8; 

मैंने इसे PostgreSQL में चलाने की कोशिश की, और यह इस त्रुटि संदेश में विफल रहा।

PGError: ERROR: column "c.name" must appear in the GROUP BY clause or be used in an aggregate function

मैं इस क्या मतलब यकीन नहीं था, इसलिए मैं खंड (MySQL ही में दोनों काम से समूह में "c.name" से "c.id" बदलते कोशिश की, किसी आइटम के नाम यह सोचते हैं अनोखा है)।

हालांकि यह सिर्फ एक समान त्रुटि

PGError: ERROR: column "c.id" must appear in the GROUP BY clause or be used in an aggregate function

उत्पादित इस समस्या को कैसे हल किया जा सकता?

+1

विचित्र रूप से, ऐसा लगता है कि अब इसे पोस्टग्रे 9.1 – you786

+0

में अनुमति दी गई है क्या इसे पोस्टग्रे 9.2 में हटा दिया गया था? मुझे इसी कारण से यह त्रुटि मिल रही है। – Aaron

+1

@Aaron: इसे हटाया नहीं गया था, लेकिन केवल तभी काम करता है ([दस्तावेज़ीकरण] उद्धृत करना (http://www.postgresql.org/docs/current/static/sql-select।एचटीएमएल)): _ ungrouped कॉलम समूहबद्ध कॉलम पर कार्यात्मक रूप से निर्भर है, क्योंकि अन्यथा एक समूह रहित कॉलम के लिए वापस आने के लिए एक से अधिक संभावित मान होंगे। एक कार्यात्मक निर्भरता मौजूद है यदि समूहबद्ध कॉलम (या इसके सबसेट) तालिका के प्राथमिक कुंजी हैं, जिसमें समूह रहित समूह_ –

उत्तर

11

आपके द्वारा चयनित स्तंभ नाम है जो आप में समूहीकरण कर रहे हैं सूची है:

SELECT c.id, c.name, SUM(ABS(v.vote)) AS score 
FROM categories c,items i, votes v 
    WHERE c.id = i.category_id 
    AND i.id = v.voteable_id 
    AND v.created_at > '#{1.week.ago}' 
GROUP BY c.id, c.name 
ORDER BY score DESC LIMIT 8; 

"। यह एक SELECT खंड कि GROUP BY क्लॉज़ में संदर्भित नहीं हैं में स्तंभ नाम शामिल करने के लिए अनुमति नहीं है"

+9

यह MySQL में अनुमत है और यही कारण है कि वह उलझन में है। मेरी राय में भयानक विशेषता – colithium

+0

यह काम किया, धन्यवाद! –

8

मुझे बस यह समस्या थी लेकिन MySQL से SQL सर्वर पर जा रहा था। मैंने सोचा कि यह अनुमति है कि यह अजीब था!

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

बस ग्रुप BY में इच्छित कॉलम रखें यदि वे वास्तव में अद्वितीय हैं। यह MySQL का "फीचर" था जो संदिग्ध था।

आप MySQL के व्यवहार के बारे में पढ़ सकते हैं और यह here अलग कैसे हो सकता है।

उदाहरण:

SELECT c.*, SUM(ABS(v.vote)) AS score 
FROM categories c,items i, votes v 
    WHERE c.id = i.category_id 
    AND i.id = v.voteable_id 
    AND v.created_at > '#{1.week.ago}' 
GROUP BY c.id, c.name, c.whatever_else 
ORDER BY score DESC LIMIT 8; 
+0

है MySQL लिंक के लिए धन्यवाद, यह अब और अधिक समझ में आता है! इस मामले में मेरा सी.आईडी हमेशा अनोखा होता है, इसलिए शायद यह ठीक था, लेकिन कम से कम मुझे पता है कि उन्होंने ऐसा क्यों किया। धन्यवाद! –

2

आप इस के लिए अपने बयान बदलते हैं तो यह काम करना चाहिए:

SELECT c.id, SUM(ABS(v.vote)) AS score 
FROM categories c,items i, votes v 
    WHERE c.id = i.category_id 
    AND i.id = v.voteable_id 
    AND v.created_at > '#{1.week.ago}' 
GROUP BY c.id 
ORDER BY score DESC LIMIT 8; 

मुझे यकीन है कि क्या MySQL एक परिणाम के रूप देता है नहीं कर रहा हूँ, लेकिन आप एक बहुत छोटे से देने के लिए क्यों इस PostgreSQL में काम नहीं करता के उदाहरण, निम्नलिखित categories मेज पर एक नज़र डालें:

id | name 
---|----- 
1 | ABC 
1 | DEF 

आप id से समूह करते हैं, इसलिए परिणाम में प्रत्येक पंक्ति में केवल एक id होना चाहिए। यदि आप name भी चुनते हैं, इसके बिना समूहबद्ध किए, तो name के परिणाम में क्या दिखाया जाना चाहिए?

यह ABC या DEF हो सकता है लेकिन डेटाबेस इंजन वास्तव में आपके लिए यह तय नहीं कर सकता है (हालांकि MySQL स्पष्ट रूप से करता है)।

+1

MySQL एक यादृच्छिक चुनता है! क्या यह अजीब नहीं है? मैंने कुछ दिनों पहले इस बारे में एक सवाल पूछा था। – colithium

+0

मुझे यह भी पता नहीं था कि यह मामला था। बहुत अजीब ... –

+0

दिलचस्प ... इस मामले में कम से कम मेरी आईडी हमेशा अद्वितीय होती है, इसलिए यह समूह के लिए एक अच्छा स्तंभ था। मुझे श्रेणी के नाम की भी आवश्यकता थी, इसलिए मैंने बस चयन और समूह दोनों में सूचीबद्ध किया। काम करने लगता है। धन्यवाद! –

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