2010-01-22 16 views
7

I asked a question yesterday MySQL का उपयोग करने के बारे में एक सर्वेक्षण के परिणामस्वरूप।एक ही पंक्ति में एकाधिक फ़ील्ड का चयन कैसे करें? (MySQL)

अब मेरा सवाल है, अगर मेरे पास सर्वेक्षण प्रश्नों की एक तालिका है, सर्वेक्षण विकल्पों की एक तालिका है, और उपयोगकर्ताओं की एक तालिका उन सर्वे सवालों के जवाब देती है, तो मैं सर्वेक्षण के सभी विकल्पों के साथ सर्वेक्षण प्रश्न का चयन कैसे करूं एक ही प्रश्न के भीतर?

प्रश्न तालिका

question_id (int) 
question (text) 

विकल्प टेबल

choice_id (int) 
question_id (int) 
choice_text (varchar) 

जवाब टेबल

answer_id (int) 
question_id (int) 
choice_id (int) 

क्या चयन मुझे लगता है कि सर्वेक्षण के लिए सभी विकल्पों के साथ (सर्वेक्षण प्रश्न पाने के लिए क्या करना चाहिए ज्ञात या अज्ञात राशि) सभी एक ही प्रश्न में? (यदि संभव हो, तो मेरे अन्य प्रश्न में पाया गया गणित भी, एक ही प्रश्न के भीतर)

मैं MySQL के साथ इतना उन्नत नहीं हूं।

धन्यवाद

संपादित करें: क्षमा करें, मैं क्या मतलब था, मैं सवाल का चयन करने के लिए एक SELECT कथन पाने के लिए कोशिश कर रहा हूँ, और सभी विकल्पों को एक पंक्ति में है कि प्रश्न करने के लिए इसी।

मैं

SELECT question_id, question, choice_id, choice_text FROM questions LEFT JOIN choices USING(question_id) 

मैं कई पंक्तियों मिलता है, प्रत्येक choice_id के लिए एक तरह कुछ करते हैं।

परिणाम की तरह कुछ

question  choice_1 choice_2 choice_3 
A or B or C  A   B  C 

गणित भाग सर्वेक्षण के परिणामों को tallying है होना चाहिए, और हाँ, choice_id, एक पी है कि अगर मदद करता है।

+0

क्या आप सिर्फ चोटी, या गणना भी चाहते हैं? आपका "अन्य प्रश्न" क्या है और आप "गणित" क्या करना चाहते हैं? –

+0

आप सही उत्तर के बारे में कोई जानकारी नहीं ढूंढ रहे हैं? बस सवाल/पसंद की संभावनाएं? –

+0

@Evan: यह एक सर्वेक्षण है, परीक्षण नहीं - कोई सही जवाब नहीं है। – Martha

उत्तर

4

सवाल और प्रत्येक प्रश्न के लिए विकल्पों को पाने के लिए:

SELECT question, choice_text 
FROM questions 
JOIN choices 
ON questions.question_id = choices.question_id 

जोड़ें पहले बाएं शामिल हों अगर आप भी सवाल नहीं विकल्प हैं कि चाहते हैं।

मायने रखता है प्राप्त करने के लिए प्रत्येक का जवाब के लिए आप यह कर सकता है:

SELECT question, choice_text, COUNT(answers.choice_id) * 100/questiontotal 
FROM questions 
JOIN (
     SELECT questions.question_id, COUNT(answers.choice_id) AS questiontotal 
     FROM questions 
     LEFT JOIN answers ON questions.question_id = answers.question_id 
     GROUP BY questions.question_id 
    ) AS answercounts 
    ON questions.question_id = answercounts.question_id 
JOIN choices ON questions.question_id = choices.question_id 
LEFT JOIN answers 
    ON questions.question_id = answers.question_id 
    AND choices.choice_id = answers.choice_id 
GROUP BY questions.question_id, choices.choice_id 
ORDER BY questions.question_id, choices.choice_id; 
:

SELECT question, choice_text, COUNT(answers.choice_id) 
FROM questions 
JOIN choices 
    ON questions.question_id = choices.question_id 
LEFT JOIN answers 
    ON questions.question_id = answers.question_id 
    AND choices.choice_id = answers.choice_id 
GROUP BY questions.question_id, choices.choice_id 
ORDER BY questions.question_id, choices.choice_id 

लोगों की है कि एक प्रतिशत (प्रति प्रश्न) निम्न क्वेरी का उपयोग के रूप में प्रत्येक जवाब चयनित की संख्या प्राप्त करने के लिए

CREATE TABLE questions (question_id int, question nvarchar(100)); 
INSERT INTO questions (question_id, question) VALUES 
(1, 'Foo?'), 
(2, 'Bar?'); 

CREATE TABLE choices (choice_id int, question_id int, choice_text nvarchar(100)); 
INSERT INTO choices (choice_id, question_id, choice_text) VALUES 
(1, 1, 'Foo1'), 
(2, 1, 'Foo2'), 
(3, 1, 'Foo3'), 
(4, 2, 'Bar1'), 
(5, 2, 'Bar2'); 

CREATE TABLE answers (answer_id int, question_id int, choice_id int); 
INSERT INTO answers (answer_id, question_id, choice_id) VALUES 
(1, 1, 1), 
(2, 1, 1), 
(3, 1, 3), 
(4, 2, 4), 
(4, 2, 5); 

और उत्पादन मैं पिछले क्वेरी के साथ मिलती है:

यहाँ testdata मैं प्रयोग किया जाता है इस डेटा पर:

'Foo?', 'Foo1', 66.6667 
'Foo?', 'Foo2', 0.0000 
'Foo?', 'Foo3', 33.3333 
'Bar?', 'Bar1', 50.0000 
'Bar?', 'Bar2', 50.0000 

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

0
SELECT questions.question_id, questions.question, choices.choice_id, choices.question_id 
FROM questions, choices 
WHERE questions.question_id = choices.question_id 
AND questions.question_id = "Something" 

काम करना चाहिए, मुझे लगता है।

2

ध्यान दें कि उत्तर तालिका को शायद QuestionID कॉलम की आवश्यकता नहीं है।

इससे आपको प्रश्न टेक्स्ट, पसंद टेक्स्ट और प्रति पसंद के उत्तरों की संख्या मिल जाएगी।

SELECT Questions.question, Choices.choice_text, Count(Answers.*) AS N 
FROM Questions INNER JOIN Choices ON Questions.question_id = Choices.question_id 
    LEFT JOIN Answers ON Choices.choice_id = Answers.choice_id 
GROUP BY Questions.question_id, Choices.choice_id 

संपादित करें: जब तक आप एसक्यूएल पर बहुत, बहुत अच्छा कर रहे हैं, यह शायद "सभी एक पंक्ति" भाग के बारे में भूल करने के लिए सबसे अच्छा है - जब तक प्रश्न प्रति विकल्पों की संख्या केवल ज्ञात नहीं है, लेकिन लगातार, और यहां तक ​​कि उस मामले में, यह आसान नहीं है। यह वास्तव में एक प्रदर्शन मुद्दा है, इसलिए जब आप परिणाम प्रदर्शित करते हैं तो इससे निपटें।

+0

+1 के लिए धन्यवाद। –

+0

और मेरी इच्छा है कि मैं अनावश्यक प्रश्नावली कॉलम को इंगित करने के लिए एक और +1 दे सकता हूं। –

+0

दुर्भाग्यवश आपकी क्वेरी मेरे लिए काम नहीं कर रही है। मुझे लगता है 'आपको अपने एसक्यूएल वाक्यविन्यास में एक त्रुटि है; मैन्युअल रूप से '*) के लिए उपयोग करने के लिए सही वाक्यविन्यास के लिए आपके MySQL सर्वर संस्करण से मेल खाता है, ASप्रश्नों से इनरर जॉइन विकल्प पर प्रश्न .question_id = Choices.q' लाइन 1 –

3

मैं मार्क बेयर्स के उत्तर का सुझाव दूंगा, हालांकि सैद्धांतिक रूप से यदि आपको केवल "उद्देश्यों को देखने के लिए" की ज़रूरत है, लेकिन एक PHP दिनचर्या के हिस्से के रूप में नहीं, तो आप कर सकते हैं।

SELECT question, GROUP_CONCAT(choice_text) as choice_texts 
FROM questions 
JOIN choices 
ON questions.question_id = choices.question_id 
GROUP BY question; 

उत्पादन होगा

'Foo?', 'Foo1,Foo2,Foo3' 
'Bar?', 'Bar1,Bar2' 

नोट 'Foo1, foo2, Foo3' एक स्तंभ नहीं तीन स्तंभों के रूप में वापस कर दी जाएगी, और group_concat हालांकि डिफ़ॉल्ट रूप से इसके उत्पादन में 1024 से अधिक वर्ण नहीं है इसे बढ़ाया जा सकता है। इसकी सिफारिश नहीं की जाती है यदि परिणाम बड़े हो सकते हैं

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