2011-06-17 4 views
9

मैं एक क्वेरी प्राप्त करने की कोशिश कर रहा हूं जो मुझे टेबल उपयोगकर्ता से उपयोगकर्ता नाम देता है, उपयोगकर्ता जॉब की संख्या जॉब 2 यूज़र से है, और तालिका में उपयोगकर्ता के स्थान की संख्या Place2User ।बाएं जुड़ने वाले दो COUNT गुणों को गुणा किया जा रहा है

निम्न क्वेरी दो गिनती कॉलम के मान को गुणा करती रहती है। उदाहरण के लिए, यदि उपयोगकर्ता 1 के लिए जॉब्स गिनती 2 होनी चाहिए और स्थान गिनती 4 होनी चाहिए, तो उपयोगकर्ता 1 पंक्ति में दोनों कॉलम "8" प्रदर्शित होंगे। मुझे यकीन है कि मैं गलत क्या कर रहा नहीं कर रहा हूँ:

SELECT `UserName`, COUNT(`Job2User`.`UserID`), COUNT(`Place2User`.`UserID`) 
FROM `Users` 
LEFT JOIN `Job2User` ON `Job2User`.`UserID`=`Users`.`UserID` 
LEFT JOIN `Place2User` ON `Place2User`.`UserID`=`Users`.`UserID` 
GROUP BY `UserName`; 

उत्तर

20

आप count(distinct ...) का उपयोग करना चाहिए अनन्य मानों की गणना करने के। उपयोगकर्ता आईडी (विदेशी कुंजी) की गणना करने के बजाय संदर्भित तालिका की प्राथमिक कुंजी की गणना करें।

docs here

आप आठ हो रही है क्योंकि आप स्थानों से नौकरियों से 2 रिकॉर्ड और 4 लौट रहे हैं देखें। आप अलग-अलग मान की गिनती नहीं कर रहे हैं जब से तुम 2 * 4 = 8.

+1

+1 टीआईएल 'गिनती (विशिष्ट ...)' के बारे में। धन्यवाद! –

0

एक विकल्प हर तालिका आप

SELECT `UserName`, `Job2User`.`Job2UserCount`, `Place2User`.`Place2UserCount` 
FROM `Users` 
` 
LEFT JOIN 
(SELECT 

COUNT(`Job2User`.`UserID`) Job2UserCount , 
UserID 
FROM 
Job2User 
GROUP BY 
    `UserID`)Job2User 
ON `Job2User`.`UserID`=`Users`.`UserID 
LEFT JOIN 
(SELECT 

COUNT(`Place2User`.`UserID`) Place2UserCount, 
UserID 
FROM 
Job2User 
GROUP BY 
    `UserID`)Place2User 
ON `Place2User`.`UserID`=`Users`.`UserID` 
GROUP BY `UserName`; 
1

आपकी समस्या होने की संभावना है की गणना करना चाहते के लिए इनलाइन दृश्यों का उपयोग करने के लिए है कि आप मानचित्रण नहीं कर रहे हैं है मिल Place2User और Job2User तालिकाओं, इस प्रकार आप एक क्रॉस जॉइनिंग को पूर्ववत कर रहे हैं। More info on Cross Joins

आपको इसे प्राप्त करने के लिए आंतरिक प्रश्नों का उपयोग करने की आवश्यकता होगी जब तक कि आप दो टेबल Place2User किसी भी तरह से Job2User से संबंधित न हों।

इस प्रयास करें:

SELECT `UserName`, `Job2User`.`Count`, `Place2User`.`Count` 
FROM `Users` 
LEFT JOIN (SELECT `UserID`, COUNT(1) AS 'Count' FROM `Job2User` GROUP BY `UserID`) `Job2User` ON `Job2User`.`UserID`=`Users`.`UserID` 
LEFT JOIN (SELECT `UserID`, COUNT(1) AS 'Count' FROM `Place2User` GROUP BY `UserID`) `Place2User` ON `Place2User`.`UserID`=`Users`.`UserID` 
0

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

SELECT `UserName`, COUNT(`Job2User`.`UserID`), COUNT(`Place2User`.`UserID`) 
FROM `Users` 
LEFT JOIN `Job2User` ON `Users`.`UserID`=`Job2User`.`UserID` 
LEFT JOIN `Place2User` ON `Users`.`UserID` =`Place2User`.`UserID` 
GROUP BY `UserName`; 

आप खेतों पर गिनती कि शून्य जब वे जुड़े हुए नहीं हैं हो जाएगा कर रहे हैं के बाद से, यह काम हो सकता है (खेद यह देर हो चुकी है और मेरे मस्तिष्क में एक छोटे से है फजी)।

SELECT UserName, 
    (SELECT COUNT(Job2User.UserID) 
    FROM Job2User 
    WHERE Job2User.UserID = t.UserID) AS Job2UserCount, 
    (SELECT COUNT(Place2User.UserID) 
    FROM Place2User 
    WHERE Place2User.UserID = t.UserID) AS Place2UserCount 
FROM Users AS t 
0

खैर प्रत्येक Job2User ure सभी Place2user इसके कारण है कि इसकी multipyed प्राप्त करने के लिए अपने सरल: यदि ऐसा नहीं होता है, तो यहां एक तरह से आप यह कर सकता है। यू को इसे सबक्वायरी में गिनना चाहिए, फिर बाएं जुड़ें का उपयोग करें।

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