2012-12-27 14 views
6

में परिणाम देता है मैं कई अलग-अलग तालिकाओं से डेटा को गठबंधन करने के लिए एकाधिक LEFT JOIN एस के साथ एक जटिल MySQL क्वेरी लिख रहा हूं।MySQL समूह निश्चित रूप से एक सरणी

$public_query = 
"SELECT * FROM `wsat_ib` 
LEFT JOIN wp_usermeta ON wsat_ib.user_id = wp_usermeta.user_id 
LEFT JOIN wpjb_resume ON wsat_ib.user_id = wpjb_resume.user_id 
LEFT JOIN wpjb_field_value ON wpjb_resume.id=wpjb_field_value.job_id 
LEFT JOIN wpjb_application ON wpjb_application.user_id = wsat_ib.user_id 
WHERE wp_usermeta.meta_key = 'target_employer' 
AND wp_usermeta.meta_value = 'public' 
AND wpjb_resume.is_active =1 
"; 

मेरे समस्या: तालिका wp_usermeta ही user_id के लिए कई पंक्तियां कर सकते हैं। उदाहरण के लिए उपयोगकर्ता (user_id = 5 के साथ) तालिका में wp_usermeta तालिका में एक पंक्ति हो सकती है: meta_key जो 'target_employer' है। यदि यह स्पष्ट नहीं है, तो पंक्तियां इस तरह दिख सकती हैं।

id user_id meta_key   meta_value 
1  5   target_employer 13 
2  5   target_employer 53 
3  79   target_employer 21 

मेरे प्रश्न: वहाँ किसी भी तरह से है कि मैं अपने परिणाम वस्तुओं में से एक में एक सरणी के रूप में wp_usermeta से प्रत्येक मिलान पंक्ति लौट सकते है? तो var_dump() कुछ इस तरह दिखेगा:

object(stdClass)#2906 (14) { 
    ["user_id"]=> 
    string(4) "5" 
    ["firstname"]=> 
    string(6) "Bilbo" 
    ["lastname"]=> 
    string(3) "Baggins" 
    ... 
    ["target_employer"]=> 
    array(2) { 
    [0]=>13, 
    [1]=>53 
    } 
} 

अद्यतन: @bpanulla: असली (unsimplified क्वेरी) यहाँ है ...

"SELECT wsat_ib.user_id, wpjb_resume.firstname, wpjb_resume.lastname, wsat_ib.overall_score, wsat_ib.account_score, wsat_ib.econ_score, wsat_ib.math_score, wsat_ib.logic_score, wsat_ib.fsanaly_score, wsat_ib.corpval_score, wsat_ib.end_time, GROUP_CONCAT(wp_usermeta.meta_value) AS target_employers, wpjb_field_value.value AS school, wpjb_application.job_id 
FROM `wsat_ib` 
LEFT JOIN wp_usermeta ON wsat_ib.user_id = wp_usermeta.user_id 
LEFT JOIN wpjb_resume ON wsat_ib.user_id = wpjb_resume.user_id 
LEFT JOIN wpjb_field_value ON wpjb_resume.id=wpjb_field_value.job_id 
LEFT JOIN wpjb_application ON wpjb_application.user_id = wsat_ib.user_id AND wpjb_application.field_id=3 
WHERE (wp_usermeta.meta_key = 'target_employer' 
AND wp_usermeta.meta_value = 'public' 
AND wpjb_resume.is_active =1) 
GROUP BY user_id 
"; 
+0

"क्या कोई तरीका है कि मैं wp_usermeta से प्रत्येक मिलान पंक्ति को मेरी परिणाम वस्तुओं में से एक में सरणी के रूप में वापस कर सकता हूं?" नहीं, एसक्यूएल को परिणाम कोशिकाओं को परमाणु होने की आवश्यकता है। कोई सरणी नहीं उपयोगकर्ता के माध्यम से एक कुंजी के रूप में, आप एक ही उपयोगकर्ता के लिए मानों को सरणी में जमा कर सकते हैं। – user4035

+0

@ user4035 क्या आप एक उदाहरण दे सकते हैं कि आपने जो वर्णन किया है उसे कैसे करें? ऐसा लगता है कि मैं क्या करना चाहता हूं। – emersonthis

उत्तर

18

मुझे नहीं लगता कि MySQL के लिए एक सरणी लौट सकते हैं पीएचपी, लेकिन इसे का उपयोग GROUP_CONCAT aggregate function. की तरह कुछ की कोशिश करो एक सीमांकित सूची लौट सकते हैं:

SELECT user_id, firstname, lastname, 
    GROUP_CONCAT(wp_usermeta.meta_value) as target_employer_id 
FROM `wsat_ib` 
    LEFT JOIN wp_usermeta ON 
     (wsat_ib.user_id = wp_usermeta.user_id 
      AND wp_usermeta.meta_key = 'target_employer') 
GROUP BY user_id, firstname, lastname 

डिफ़ॉल्ट रूप से आप ELEM की एक अल्पविराम से अलग किए मिलना चाहिए target_employer_id में ents। आप अपने PHP तर्क में एक सरणी में बदलने के लिए PHP explode फ़ंक्शन का उपयोग कर सकते हैं।

+0

अच्छा! मुझे लगता है कि यह काम करेगा। मैं इसे आज़मा दूंगा। – emersonthis

+0

मुझे लगभग यह काम मिल गया है, लेकिन मैं 'ग्रुप बाय' के साथ संघर्ष कर रहा हूं। मुझे पंक्तियों की अपेक्षित संख्या वापस आती है, लेकिन मैं उलझन में हूं कि मुझे target_employer फ़ील्ड में एकाधिक डुप्लिकेट क्यों मिल रहे हैं। भले ही मेरे अधिकांश उपयोगकर्ताओं में केवल एक लक्षित नियोक्ता है, फिर भी मैं प्रत्येक पंक्ति में 1 और 12 नियोक्ता आईडी के बीच कहीं भी देखता हूं। अधिकांश एक ही मान के दोहराए जाते हैं, जो अजीब है क्योंकि wp_usermeta तालिका में डुप्लिकेट कुंजी/मान जोड़े * नहीं * की अनुमति है। कोई सलाह? – emersonthis

+1

GROUP_CONCAT फ़ंक्शन कुछ अतिरिक्त पैरामीटर लेता है जो इन मामलों में मदद कर सकते हैं (मेरे द्वारा लिंक किए गए दस्तावेज़ पृष्ठ देखें)। विशेष रूप से, एक अद्वितीय सूची प्राप्त करने के लिए 'GROUP_CONCAT (DISTINCT wp_usermeta.meta_value) 'आज़माएं। मैं थोड़ी परेशान हूं कि डुप्लिकेट होगा, जब तक आप मिश्रण में और अधिक टेबल नहीं जोड़ते हैं और जुड़ने से गुणा पंक्तियां प्राप्त कर रहे हैं। – bpanulla

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