मैं वर्तमान में एक वेबपैप लिख रहा हूं जो उत्तर प्रश्न के आधार पर उपयोगकर्ताओं से मेल खाता है। मैंने अपने मिलान करने वाले एल्गोरिदम को केवल एक प्रश्न में महसूस किया है और इसे अब तक ट्यून किया है कि 2 उपयोगकर्ताओं के बीच मिलान प्रतिशत की गणना करने में 8.2ms लगते हैं। लेकिन मेरे वेबपैप को इस क्वेरी को करने वाली सूची के माध्यम से उपयोगकर्ताओं की एक सूची लेनी है और फिर से शुरू करना है। 5000 उपयोगकर्ताओं के लिए यह मेरी स्थानीय मशीन पर 50sec लिया। क्या सब कुछ एक प्रश्न में रखना संभव है जो उपयोगकर्ता_आईडी के साथ एक कॉलम और गणना के साथ एक कॉलम देता है? या एक संग्रहीत प्रक्रिया एक विकल्प है?एसक्यूएल: मिलान प्रतिशत के लिए गणना कॉलम के साथ उपयोगकर्ता तालिका लौटाएं?
मैं वर्तमान में MySQL के साथ काम कर रहा हूं लेकिन यदि आवश्यक हो तो डेटाबेस स्विच करने के इच्छुक हूं। http://sqlfiddle.com/#!2/84233/1
और मेरे मिलते जुलते क्वैरी:
SELECT COALESCE(SQRT((100.0*as1.actual_score/ps1.possible_score) * (100.0*as2.actual_score/ps2.possible_score)) - (100/ps1.commonquestions), 0) AS perc
FROM (SELECT SUM(imp.value) AS actual_score
FROM user_questions AS uq1
INNER JOIN importances imp ON imp.id = uq1.importance
INNER JOIN user_questions uq2 ON uq2.question_id = uq1.question_id AND uq2.user_id = 101
AND (uq1.accans1 = uq2.answer_id
OR uq1.accans2 = uq2.answer_id
OR uq1.accans3 = uq2.answer_id
OR uq1.accans4 = uq2.answer_id)
WHERE uq1.user_id = 1) AS as1,
(SELECT SUM(value) AS possible_score, COUNT(*) AS commonquestions
FROM user_questions AS uq1
INNER JOIN importances ON importances.id = uq1.importance
INNER JOIN user_questions uq2 ON uq1.question_id = uq2.question_id AND uq2.user_id = 101
WHERE uq1.user_id = 1) AS ps1,
(SELECT SUM(imp.value) AS actual_score
FROM user_questions AS uq1
INNER JOIN importances imp ON imp.id = uq1.importance
INNER JOIN user_questions uq2 ON uq2.question_id = uq1.question_id AND uq2.user_id = 1
AND (uq1.accans1 = uq2.answer_id
OR uq1.accans2 = uq2.answer_id
OR uq1.accans3 = uq2.answer_id
OR uq1.accans4 = uq2.answer_id)
WHERE uq1.user_id = 101) AS as2,
(SELECT SUM(value) AS possible_score
FROM user_questions AS uq1
INNER JOIN importances ON importances.id = uq1.importance
INNER JOIN user_questions uq2 ON uq1.question_id = uq2.question_id AND uq2.user_id = 1
WHERE uq1.user_id = 101) AS ps2
आप क्वेरी के दो "पैरों" के "सामान्य प्रश्न" उप-अभिव्यक्ति को जोड़ सकते हैं। आप उपयोगकर्ता = 1 और उपयोगकर्ता = 101 के लिए एक सामान्यीकृत सीटीई क्वेरी में उपकुंजी को सामान्यीकृत भी कर सकते हैं (यदि आपका डीबीएमएस उन्हें suppoert। लेकिन पहले: कृपया हमें टेबल परिभाषाएं और शायद कुछ डेटा दिखाएं। – wildplasser
हां, संबंधित वांछित आउटपुट के साथ डेटा –
मैंने साथ खेलने के लिए एक SQLFiddle बनाया है :) जब मैं उपयोगकर्ता 1 और 5 से मेल खाता हूं तो परिणाम '43.678 'होना चाहिए http://sqlfiddle.com/#!2/84233/1 – Mexxer