मैं अक्सर देखता हूं कि लोग एक ही प्रश्न में एक तालिका में शामिल होने के विचार से या एक ही प्रश्न में कई बार संघर्ष करते हैं (जैसा कि यह यहां था)। एक बार महारत हासिल करने के बाद, यह उन तालिकाओं पर उपयोग करने के लिए एक बेहतरीन तकनीक है, जिनमें पंक्तियों के बीच बहुत सारे संबंध होते हैं (जैसे कि टीमों की सूची जिन्हें एक-दूसरे के साथ खेलना है!) जैसा कि अन्य ने बताया है, आपको दो inner join
. का उपयोग करने की आवश्यकता है इसे पूरा करने के लिए:
select
*
from
games g
inner join teams t1 on
g.teamid1 = t1.teamid
inner join teams t2 on
g.teamid2 = t2.teamid
तो, अगर आपके games
तालिका इस तरह दिखती है:
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 2 1
आपको इसका परिणाम सेट मिलेगा:
g.GameID g.TeamID1 g.TeamID2 t1.TeamID t1.Name t2.TeamID t2.Name
----------------------------------------------------------------------------------
1 1 3 1 Lions 3 Bears
2 4 2 4 Oh My 2 Tigers
3 2 1 2 Tigers 1 Lions
बेशक, मैं इन स्तंभों को select
. में उपनाम दूंगा कथन, अगर मैं मैं होता, तो प्रयोज्य के लिए:
select
g.GameID,
t1.Name as Team1,
t2.Name as Team2
from
...
इस तरह, t1
. होने के बजाय, स्तंभों को उचित नाम दिया जा सकता है और t2
कॉलम समान नाम साझा करते हैं।
अब, इस भ्रम को दूर करने के लिए कि left join
है। आप देखें, एक left join
पहली (या बाईं) तालिका से सभी पंक्तियों को ले जाएगा, और फिर दूसरी (या दाएं) तालिका में शामिल होने की स्थिति में किसी भी पंक्ति का मिलान करेगा। बाईं तालिका से किसी भी पंक्ति के लिए, आपको null
मिलेगा right
. के सभी कॉलम में टेबल।
एक उदाहरण पर विचार करते हुए, मान लें कि किसी ने null
. में डाल दिया है TeamID2
. के लिए किसी भी कारण से पंक्तियों में से एक पर। यह भी मान लें कि TeamID
. की एक टीम 4 पहले मौजूद था, लेकिन अब नहीं है।
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 1 null
अब, आइए एक नजर डालते हैं कि left join
प्रश्न के संदर्भ में होगा:
select
*
from
games g
left join teams t1 on
g.teamid1 = t1.teamid
left join teams t2 on
g.teamid2 = t2.teamid
तार्किक रूप से, यह हमारे सभी games
को हथिया लेगा , और फिर उनका संबंधित teams
. से मिलान करें . हालांकि, अगर एक TeamID
मौजूद नहीं है, हमें null
मिलेगा एस। यह ऐसा दिखेगा:
g.GameID g.TeamID1 g.TeamID2 t1.TeamID t1.Name t2.TeamID t2.Name
----------------------------------------------------------------------------------
1 1 3 1 Lions 3 Bears
2 4 2 null null 2 Tigers
3 1 null 1 Lions null null
इसलिए, एक left join
होगा केवल यदि कोई टीम वैकल्पिक हो तो आवश्यक हो।
आपके मामले में, आप एक inner join
. का उपयोग करेंगे एक तालिका में कई बार शामिल होने के लिए। यह एक बहुत ही सामान्य अभ्यास है और काफी उपयोगी है। यह सबक्वायरी (विशेष रूप से MySQL पर) के कुछ नुकसान से बचा जाता है, जबकि आपको इंट्राटेबल तुलना के लिए टेबल से डेटा हथियाने की अनुमति देता है। किसी चीज़, या संबंधित पंक्तियों के क्रम को खोजने का प्रयास करते समय यह स्पष्ट रूप से उपयोगी होता है।
वैसे भी, मुझे आशा है कि यह बहुत ही मनोरंजक उत्तर कहीं न कहीं किसी की मदद करता है।