MySQL का उपयोग करके तीन तालिकाओं में शामिल होना


117

मेरे पास तीन टेबल हैं

**Student Table**
-------------
id    name
-------------
1     ali
2     ahmed
3     john
4     king

**Course Table**
-------------
id    name
-------------
1     physic
2     maths
3     computer
4     chemistry

**Bridge**
-------------
sid    cid
-------------
1     1
1     2
1     3
1     4
2     1
2     2
3     3
3     4
4     1
4     2

अब छात्र के नाम को उस पाठ्यक्रम के नाम के साथ दिखाना है जिसका उसने अध्ययन किया था,

**Result**
---------------------------
Student        Course
---------------------------
ahmed         physic
ahmed         maths
ahmed         computer
ahmed         chemistry
ali           physic
ali           maths
john          computer
john          chemistry
king          physic
king          maths

मैं निम्नलिखित क्वेरी का निर्माण करता हूं

select s.name as Student, c.name as Course from student s, course c join bridge b on c.id = b.cid order by s.name

लेकिन यह आवश्यक परिणाम वापस नहीं करता है ...

और सामान्यीकृत रूप के लिए क्या होगा, अगर मैं यह खोजना चाहता हूं कि कौन दूसरे पर प्रबंधक है:

**employee**
-------------------
id        name
-------------------
1         ali
2         king
3         mak
4         sam
5         jon

**manage**
--------------
mid      eid
--------------
1         2
1         3
3         4
4         5

और यह परिणाम प्राप्त करना चाहता है:

**result**
--------------------
Manager      Staff
--------------------
ali          king
ali          mak
mak          sam
sam          jon

पहले परिणाम में आपने
अहम्

जवाबों:


150

बस उपयोग करें:

select s.name "Student", c.name "Course"
from student s, bridge b, course c
where b.sid = s.sid and b.cid = c.cid 


1
अच्छा और आसान है, लेकिन FWIW पर विचार इस वाक्य फिर से निम्न ब्लॉग: sqlblog.org/2009/10/08/bad-habits-to-kick-using-old-style-joins के रूप में उल्लेख किया stackoverflow.com/a/13476050/ 199,364
ToolmakerSteve

199

ANSI सिंटैक्स का उपयोग करें और यह बहुत अधिक स्पष्ट होगा कि आप तालिकाओं में कैसे शामिल हो रहे हैं:

SELECT s.name as Student, c.name as Course 
FROM student s
    INNER JOIN bridge b ON s.id = b.sid
    INNER JOIN course c ON b.cid  = c.id 
ORDER BY s.name 

9
@ मुहम्मद: हमारे उत्तर समान हैं, वे केवल वाक्यविन्यास में भिन्न हैं। यदि आप ANSIवाक्य रचना के बारे में नहीं जानते हैं , तो इसे सीखने के लिए आपके समय की कीमत अच्छी है। यह JOINभविष्य में आपके द्वारा की गई त्रुटियों से बचने में आपकी मदद करेगा ।
रेडफिल्टर

16

सामान्य रूप के लिए

select e1.name as 'Manager', e2.name as 'Staff'
from employee e1 
left join manage m on m.mid = e1.id
left join employee e2 on m.eid = e2.id

क्रम में फर्क पड़ता है m.mid = e1.idऔर m.eid = e2.id?
पाथ्र्स

1
@Pathros नहीं, उन भावों में क्रम मायने नहीं रखता।
टूलमेकरसैट

4
SELECT *
FROM user u
JOIN user_clockits uc ON u.user_id=uc.user_id
JOIN clockits cl ON cl.clockits_id=uc.clockits_id
WHERE user_id = 158

यह उत्तर पहले से 5 साल पहले दिए गए उत्तरों के समान दिखता है। आपके जवाब के बारे में क्या आपको लगता है कि महत्वपूर्ण है, और मौजूदा उत्तरों से गायब है?
टूलमेकरसैट

1
SELECT 
employees.id, 
CONCAT(employees.f_name," ",employees.l_name) AS   'Full Name', genders.gender_name AS 'Sex', 
depts.dept_name AS 'Team Name', 
pay_grades.pay_grade_name AS 'Band', 
designations.designation_name AS 'Role' 
FROM employees 
LEFT JOIN genders ON employees.gender_id = genders.id 
LEFT JOIN depts ON employees.dept_id = depts.id 
LEFT JOIN pay_grades ON employees.pay_grade_id = pay_grades.id 
LEFT JOIN designations ON employees.designation_id = designations.id 
ORDER BY employees.id;

आप ऊपर दिए गए इस उदाहरण की तरह कई टैब शामिल कर सकते हैं।


पहले से ही कई उत्तर हैं, सालों पहले से, "कई तालिकाओं में शामिल होना" दिखाते हैं। आपका जवाब चर्चा में क्या जोड़ता है?
टूलमेकरसइट

0

दो से अधिक तालिकाओं में शामिल होने की क्वेरी:

SELECT ops.field_id, ops.option_id, ops.label
FROM engine4_user_fields_maps AS map 
JOIN engine4_user_fields_meta AS meta ON map.`child_id` = meta.field_id
JOIN engine4_user_fields_options AS ops ON map.child_id = ops.field_id 
WHERE map.option_id =39 AND meta.type LIKE 'outcomeresult' LIMIT 0 , 30

पहले से ही कई उत्तर हैं, सालों पहले से, "कई तालिकाओं में शामिल होना" दिखाते हैं। आपका जवाब चर्चा में क्या जोड़ता है?
टूलमेकरसैट

0

इसे इस्तेमाल करो:

SELECT s.name AS Student, c.name AS Course 
FROM student s 
  LEFT JOIN (bridge b CROSS JOIN course c) 
    ON (s.id = b.sid AND b.cid = c.id);

1
यह उत्तर इस प्रश्न के लिए कुछ भी नया नहीं जोड़ता है और अजीब का उपयोग करता है (यदि सादे गलत वाक्यविन्यास नहीं है, तो मुझे आश्चर्य होगा कि यह MySQL में भी मान्य था)।
एयरोएक्स

मैं एयरो से असहमत हूं। एएनएसआई सिंटैक्स में शामिल होने का मतलब पुराने स्कूल कॉमा / जहां सिंटैक्स में शामिल होना है, के साथ समस्याओं का समाधान करना है। मैं यह देखने के लिए देख रहा हूं कि क्या MySql विशेष रूप से वाक्यविन्यास में शामिल होने के लिए asi का समर्थन करता है।
लैरी स्मिथ

0

उस तरह से शामिल न हों। यह वास्तव में बहुत बुरा अभ्यास है !!! यह बड़े पैमाने पर डेटा के साथ लाने में प्रदर्शन को धीमा कर देगा। उदाहरण के लिए, यदि प्रत्येक तालिकाओं में 100 पंक्तियाँ थीं, तो डेटाबेस सर्वर को 100x100x100 = 1000000कई बार लाना पड़ता है । इसे 1 millionकई बार लाना पड़ा । उस समस्या को दूर करने के लिए, पहले दो तालिका में शामिल हों जो परिणाम को न्यूनतम संभव मिलान में ला सकती है (यह आपके डेटाबेस स्कीमा पर निर्भर है)। Subquery में उस परिणाम का उपयोग करें और फिर इसे तीसरी तालिका में शामिल करें और इसे लाएं। बहुत पहले शामिल होने के लिए -> 100x100= 10000बार और मान लें कि हमें 5 मिलान परिणाम मिलते हैं। और फिर हम परिणाम के साथ तीसरी तालिका में शामिल हो जाते हैं -> 5x100 = 500.कुल भ्रूण = 10000+500 = 10200केवल बार। और इस तरह, प्रदर्शन बढ़ता चला गया !!!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.