2012-12-10 14 views
5

कृपया तालिकाओं के लिए इस एसक्यूएल फिडल पर देखने के शून्य मान और क्या क्वेरी मैं कोशिश की है वापस जाने के लिए:
SQL Fiddleकैसे का उपयोग कर एसक्यूएल वाम जुड़ें

तो बुनियादी तौर पर, मैं दो तालिकाओं अर्थात् tbl_curriculum और tbl_enrolled_subjects है ।

tbl_curriculum में सभी विषयों (subject_id) शामिल हैं जो छात्र को अपने पाठ्यक्रम (कोर्स_आईडी) के आधार पर लेना चाहिए।
tbl_enrolled_subjects में tbl_curriculum पर आधारित सभी विषयों को छात्र/नामांकित किया गया है।

मैं जो विषयों के छात्र ले लिया है और जो नहीं है, क्वेरी कुछ इस तरह लौटना चाहिए जाँच करना चाहते हैं:

Subject_id|Grade|Status 
23  | 2 |Passed 
24  | 2 |Passed 
31  | 2 |Passed 
50  | 2 |Passed 
83  | 1 |Passed 
27  |NULL |NULL 
28  |NULL |NULL 
29  |NULL |NULL 

। । । और इतने पर।

ग्रेड और स्थिति के साथ Subject_ID का मतलब है कि छात्र पहले से ही विषय ले चुका है। दूसरी ओर, नल मूल्यों से संकेत मिलता है कि छात्र ने अभी तक उन विषयों को नहीं लिया है।
मैं इस क्वेरी के लिए इस्तेमाल किया:

SELECT a.subject_id, b.grade, b.status 
FROM tbl_curriculum a 
LEFT JOIN tbl_enrolled_subjects b 
ON a.course_id = b.course_id AND a.subject_id = b.subject_id 
WHERE b.student_id_no='05-0531'; 

लेकिन मैं केवल विषयों छात्र ले लिया है मिलती रहती है।

Subject_id|Grade|Status 
23  | 2 |Passed 
24  | 2 |Passed 
31  | 2 |Passed 
50  | 2 |Passed 
83  | 1 |Passed 

क्या मुझे कुछ याद आ रही है? अग्रिम में धन्यवाद।

+0

आप नहीं कर सकते हैं, जहां खंड को वास्तविक – ajreal

+0

@ajreal के रूप में मूल्यांकन करने की आवश्यकता है तो मुझे क्या करना चाहिए? –

उत्तर

5

कारण आप किसी भी nulls नहीं मिल रहे हैं की कोशिश करो। लेकिन, आपके पास डेटा के साथ student_id_no भी उस मामले में शून्य होगा जहां छात्र ने कक्षा नहीं ली है ... इस प्रकार आप उन्हें फ़िल्टर कर रहे हैं।

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

SELECT a.subject_id, b.grade, b.status, b.student_id_no 
FROM tbl_curriculum a 
LEFT JOIN tbl_enrolled_subjects b 
ON a.course_id = b.course_id AND a.subject_id = b.subject_id 
where student_id_no is null or student_id_no = '05-0531' 
order by subject_id 

http://sqlfiddle.com/#!2/4c7b2/43

+0

यह काम करता है लेकिन जब मेरे डेटाबेस में 100k + रिकॉर्ड शामिल होते हैं, तो इसमें 103 सेकंड लगते हैं, क्या आप मुझे बता सकते हैं कि मुझे किस क्षेत्र में इंडेक्स जोड़ना चाहिए? –

+0

चूंकि बाएं से जुड़ने से संकेत मिलता है कि बाएं टेबल से सभी परिणाम लौटते हैं, तो मैं पहले यह निर्धारित करता हूं कि क्या सभी tbl_curriculum से धीमेपन से पीड़ित हैं। यदि नहीं, तो हम केवल एक ही वास्तविक क्षेत्र का उपयोग कर रहे हैं student_id_no और दो फ़ील्ड हम कोर्स_आईडी और topic_id के साथ शामिल हो रहे हैं। मैं वहां कोशिश करूंगा। आम तौर पर क्वेरी निष्पादन योजना को देखना हमेशा एक अच्छा विचार है। http://dev.mysql.com/doc/refman/5.5/en/execution-plan-information.html – purgatory101

1

क्योंकि आपके जहां-खंड बाहर भरा एक student_id_no साथ पंक्तियों के लिए खोज कर रहा है कि इस प्रश्न ::

SELECT a.subject_id, b.grade, b.status 
FROM tbl_curriculum a 
JOIN tbl_enrolled_subjects b 
ON a.course_id = b.course_id AND a.subject_id = b.subject_id 
WHERE b.student_id_no='05-0531' 
union 
select subject_id,null,null 
from tbl_curriculum 
where concat(subject_id,course_id) not in (
    select concat(subject_id,course_id) 
from tbl_enrolled_subjects 
WHERE student_id_no='05-0531') 
+0

यह भी काम करता है लेकिन जब मेरे डेटाबेस पर 100k + रिकॉर्ड होते हैं, तो यह दर्दनाक रूप से धीमा होता है। क्या आपको कोई जानकारी है कि मुझे किस क्षेत्र में इंडेक्स जोड़ना चाहिए? धन्यवाद। –

2

बहुत सरल है, आप IS EMPTY

का उपयोग अपने इकाई में आप एक उलटा कुंजी परिभाषित किया है, जहां उलटा कुंजी है तो आप अपने इकाई प्रमुख फोन खाली।

SELECT a FROM tbl_curriculum a WHERE a.enrollers IS EMPTY; 

तो मैं एक क्षेत्र पाठ्यक्रम tbl_curriculum

/** 
* 
* @ORM\OneToMany(targetEntity="tbl_enrolled_subjects", mappedBy="id") 
*/ 
private $enrollers; 
0

में tbl_enrolled_subjects तरह परिभाषित मैं शामिल हों विधेय में छात्र फिल्टर डाल विश्वास भी वांछित परिणाम देता है। यह एसक्यूएल फिडल में काम करता है लेकिन मुझे नहीं पता कि यह क्वेरी प्लान को कैसे प्रभावित करता है।

SELECT a.subject_id, b.grade, b.status 
FROM tbl_curriculum a 
LEFT JOIN tbl_enrolled_subjects b 
ON a.course_id = b.course_id AND a.subject_id = b.subject_id 
**AND** b.student_id_no='05-0531'; 
संबंधित मुद्दे