2010-03-23 17 views
6

मैं इस तरह एक पुरानी मेज है:कैसे शामिल होने के लिए mysql टेबल

user> id | name | address | comments 

और अब मैं कुछ उन कुछ कारणों के लिए एक अन्य नाम है करने के लिए अनुमति देने के लिए एक "उर्फ" तालिका बनाने के लिए है। मैं इस तरह एक नया टेबल 'user_alias' बना लिया है:

user_alias> name | user 

लेकिन अब मैं अपने गरीब एसक्यूएल स्तर की वजह से एक समस्या है ... दोनों तालिकाओं में शामिल होने के लिए कुछ इस तरह उत्पन्न करने के लिए:

1 | my_name | my_address | my_comments 
1 | my_alias | my_address | my_comments 
2 | other_name | other_address | other_comments 

SELECT user.* FROM user LEFT JOIN user_alias ON `user`=`id` 

लेकिन यह नहीं करता है:

मेरा मतलब है, मैं एक "चुनें ..." क्वेरी कि "उपयोगकर्ता" तालिका सभी उपयोगकर्ताओं और सभी उर्फ ​​.. इस तरह के स्वरूप में ही रिटर्न बनाना चाहते मेरे लिए काम नहीं करता ..

उत्तर

2

कुछ

SELECT user.name, user.address, user.comment FROM user 
UNION ALL 
SELECT user_alias.alias, user.address, user.comment 
    FROM user INNER JOIN user_alias on user.name = user_alias.name 
ORDER BY name 

की तरह आप आप क्या चाहते हैं के करीब मिल जाएगा।

आपको दो चयनों को एक साथ जोड़ना होगा क्योंकि अन्य लोगों द्वारा प्रस्तावित बाएं जॉइन समाधान में उपनाम वाले उपयोगकर्ताओं के लिए परिणाम सेट में केवल एक पंक्ति शामिल होगी, आपके प्रश्न में निर्दिष्ट दो नहीं।

लेकिन आपको आम कॉलम को उपयोगकर्ता में शामिल करना चाहिए और आईडी कॉलम को उपनाम बनाना चाहिए, नाम कॉलम नहीं।

+0

बिल्कुल सही! यह समाधान है। मुझे नहीं पता कि यह सबसे अच्छा है, लेकिन यह काम करता है! केवल एक छोटी सी गलती: चयन user.name, user.address, से उपयोगकर्ता यूनिअन user.comment सभी चयन user_alias.alias, user.address, user.comment उपयोगकर्ता भीतर से user.id = user_alias पर user_alias शामिल हों। उपयोगकर्ता नाम से आदेश – Ivan

+0

ओह, अब मैं आपकी जॉइन देखता हूं। उपयोगकर्ता_alias.user को user_alias.user_id का नाम बदलना चाहिए ताकि यह स्पष्ट हो सके कि क्या हो रहा है। –

3

मुझे लगता है कि आप कुछ इस तरह की जरूरत है:

SELECT user.* 
FROM user 
LEFT JOIN user_alias 
ON user.name=user_alias.name 

आपका मूल प्रश्न हालत में शामिल होने में काफी विशेष नहीं था।

+0

यह आईडी = 1 के लिए केवल एक पंक्ति उत्पन्न करता है, अनुरोध के अनुसार दो नहीं। –

+0

हाँ, काम नहीं कर रहा है .. – Ivan

+0

इवान, नीचे मेरा जवाब देखें। –

2
SELECT user.* FROM user LEFT JOIN user_alias ON user.name = user_alias.name 
0

सबसे पहले - क्वेरी आप बनाना चाहते हैं क्योंकि आप कुछ परिणाम एक से अधिक पंक्ति में फैला पाने के लिए कोशिश कर रहे हैं, तुच्छ नहीं है। तो मैं आपको एक फैशन में उचित समाधान प्रदान करूंगा जैसा कि यह होना चाहिए (पढ़ना: एक डेटाबेस डेवलपर ऐसा करेगा :-)।

सबसे पहले, आपको अपनी user_alias तालिका को संशोधित करना चाहिए ताकि इसमें id कॉलम हो लेकिन नाम न हो। name फ़ील्ड का उपयोग करके अपनी टेबल में शामिल होना अच्छा नहीं है। इसका कारण यह है कि दो सारा कॉनर्स हो सकते हैं।

SELECT user.*, user_alias.* 
FROM user LEFT JOIN user_alias 
ON user.id=user_alias.id 

इस तरह से आप इस तरह के प्रारूप में अपने परिणाम मिलेंगे:

फिर, आप इस क्वेरी का उपयोग कर दोनों तालिकाओं से परिणाम प्राप्त कर सकते हैं जब

id | name   | address  | comments | user 
------------------------------------------------------------- 
1 | Sarah Connor | Planet Earth | Nice woman | sarah_connor 
2 | Sarah Connor | USA, NY  | Mean woman | sarah_c 
3 | John Connor | USA, NY  | n00b  | john123 

स्थितियों में दो या दो से उसी व्यक्ति के लिए user_alias तालिका में अधिक रिकॉर्ड (बराबर id), आपको कुछ ऐसा मिलेगा:

id | name   | address  | comments | user 
------------------------------------------------------------- 
4 | Bill Clinton | White House | President | bill 
4 | Bill Clinton | White House | President | monica 
,210
+0

समस्या यह है कि ऐसी स्थितियों में जहां फ़ाइल पर केवल एक उपनाम है, आप परिणाम सेट में केवल एक पंक्ति वापस कर देंगे। लेकिन ओपी चाहता है कि दो पंक्तियां लौट जाएं (उपयोगकर्ता पंक्ति और उपयोगकर्ता_आला से उपनाम को जोड़ने वाली एक अलग पंक्ति मेल खाने वाली उपयोगकर्ता पंक्ति से पता और टिप्पणी के साथ)। –

+0

अधिक आम तौर पर, समस्या यह है कि जब फ़ाइल पर किसी भी उपनाम हैं, तो आप उपयोगकर्ता तालिका से मूल अनियमित पंक्ति वापस नहीं करेंगे। –

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