2012-02-25 24 views
5

मेरे पास तीन टेबल हैं जो मैं इस प्रश्न में लिंक करना चाहता हूं।MySQL पूर्ण एक टेबल में शामिल हों, और बाएं एक ही प्रश्न में दूसरे से जुड़ें?

स्क्रिप्ट एक उपस्थिति रजिस्टर है, इसलिए यह प्रति उपयोगकर्ता प्रत्येक मीटिंग के लिए उपस्थिति चिह्न रिकॉर्ड करता है।

तीन टेबल का प्रयोग किया:

"टीम":

id | fullname | position   | class | hidden 
1 | Team  | --    | black | 1 
2 | Dan S | Team Manager  | green | 0 
3 | Harry P | Graphic Engineer | blue | 0 

"रजिस्टर":

id | mid | uid | mark 
1 | 1 | 2 |/
2 | 1 | 3 | I 
3 | 2 | 1 |/
4 | 2 | 3 |/

"बैठकों":

id | maintask   | starttime | endtime 
1 | Organise Year Ahead | 1330007400 | 1330012800 
2 | Gather Ideas  | 1330612200 | 1330617600 
3 | TODO    | 1331217000 | 1331222400 

एक नमूना नहीं है डेटा का मैं क्या करना चाहता हूं:

रजिस्टर से सभी परिणाम चुनें, उन्हें उपयोगकर्ता द्वारा समूहित करें, और मीटिंग प्रारंभ समय तक उन्हें आदेश दें। "-" लेकिन, अगर वहाँ रजिस्टर तालिका में एक निशान नहीं है, मैं इसे प्रदर्शित करना चाहते हैं (php के माध्यम से किया जा सकता है यदि आवश्यक हो) तो एक अपेक्षित परिणाम तो जैसे:

fullname | mark | mid 
Dan S |/ | 1 
Dan S |/ | 2 
Dan S | - | 3 
Harry P | I | 1 
Harry P |/ | 2 
Harry P | - | 3 

मेरे एसक्यूएल क्वेरी इस पर है पल:

आपको चुनें। fullname, यू। id, आर। mark, आर। midteam से आप पूरी तरह से जुड़ें register r ON r। uid = यू। id बाएं जॉइन meetings एम आर। mid = एम। id आपके द्वारा ग्रुप। id एम द्वारा आदेश। starttime एएससी

और मैं MySQL से वापस कोई त्रुटि मिलती है:

आप अपने एसक्यूएल वाक्य रचना में एक त्रुटि है, मैन्युअल जांचें कि 'पूर्ण जॉइन register r ON r के पास का उपयोग करने के लिए सही वाक्यविन्यास के लिए आपके MySQL सर्वर संस्करण से मेल खाता है। uid = यू। id बाएं जॉइन meetings मीटर चालू आर। mid = लाइन 1

पर m.`id 'लेकिन, मैं नहीं कर सकते यह कोई समस्या दिखाई:, एस

कृपया किसी को बाहर मदद कर सकता है सही दिशा में मुझे बिंदु या मेरे लिए एक संभव समाधान दे इस। बहुत सराहना

दान

उत्तर: क्वेरी कि काम किया:

SELECT  
     u.fullname, u.id as uid,  
     if(r.uid = u.id, r.mark, '-') as mark,  
     if(r.uid = u.id, r.mid, '-') as mid,  
     r.mid, m.starttime 
    FROM  
     team u 
     CROSS JOIN  
     register r ON u.id = r.uid 
     LEFT OUTER JOIN  
     meetings m ON r.mid = m.id 
    WHERE  
     u.hidden = 0 
    GROUP BY  
     u.id, r.mid 
    ORDER BY  
     m.starttime, u.id ASC 

उत्तर

4

Full outer join MySQL द्वारा समर्थित नहीं है। कम से कम संस्करण 5.6 तक, आप MySQL Join doc देख सकते हैं।

संपादित

SELECT 
    UxM.fullname, 
    r.mark, 
    UxM.mid, 
    UxM.starttime 
FROM 
    (select u.id as uid, m.id as mid, u.fullname, m.starttime 
    from 
    team u 
     CROSS JOIN 
    meetings) UxM 
    left join 
    register r 
     on UxM.uid = r.uid and UxM.mid = r.mid 
ORDER BY 
    UxM.starttime ASC 

अगर यह आपकी समस्या का समाधान मुझे जानते हैं: एक cross join एक समाधान हो सकता है।


एक सरलीकरण:

SELECT  
    u.fullname, 
    u.id AS uid,  
    COALESCE(r.mark, '-') AS mark,  
    COALESCE(r.mid, '-') AS mid,  
    m.id, 
    m.starttime 
FROM  
    team u 
     CROSS JOIN  
    meetings m 
     LEFT JOIN  
    register r 
     ON r.mid = m.id 
     AND r.id = u.uid 
WHERE  
    u.hidden = 0 
GROUP BY  
    m.id, u.id 
ORDER BY  
    m.starttime, u.id 
+0

Ive MySQL में यह प्रयोग किया जाता o.o से पहले मुझे यकीन है कि मैं है हूँ - शायद नहीं, वाम बाहरी के साथ भ्रमित हो गया हो सकता है शामिल हों या कुछ और। पूर्ण बाहरी शामिल होने के बजाय मैं क्या उपयोग कर सकता हूं जो वही काम करेगा? –

+0

Google 'पूर्ण बाहरी जॉइन' के लिए कुछ समाधानों के लिए 'पूर्ण बाहरी mysql' अनुकरण' के लिए Google जो वास्तव में mysql में मौजूद नहीं है। – biziclop

+0

आपको बहुत धन्यवाद, क्रॉस जॉइन पूरी तरह से काम किया :) (किसी कारण से मैं स्वीकार्य उत्तर o.O के रूप में चिह्नित नहीं कर सकता) –

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