2009-01-03 5 views
73

ठीक है, यहां मेरी दुविधा है, मेरे पास एक ही डेटाबेस संरचना के साथ लगभग 5 टेबल के साथ एक डेटाबेस स्थापित है। डेटा स्थानीयकरण उद्देश्यों के लिए इस तरीके से अलग किया गया है और कुल 4.5 मिलियन रिकॉर्ड विभाजित करने के लिए।MySQL - एक ही संरचना के साथ सभी तालिकाओं से डेटा का चयन करना, लेकिन अलग-अलग डेटा

अधिकांश समय केवल एक टेबल की आवश्यकता होती है और सब ठीक है। हालांकि, कभी-कभी तालिकाओं के 2 या अधिक से डेटा की आवश्यकता होती है और इसे उपयोगकर्ता परिभाषित कॉलम द्वारा सॉर्ट करने की आवश्यकता होती है। यह वह जगह है जहां मुझे समस्याएं आ रही हैं।

डेटा स्तंभ:

id, band_name, song_name, album_name, genre 

MySQL बयान:

SELECT * from us_music, de_music where `genre` = 'punk' 

MySQL इस त्रुटि बाहर थूक:

#1052 - Column 'genre' in where clause is ambiguous 

जाहिर है, मैं इस गलत कर रहा हूँ। किसी के लिए इस पर कुछ प्रकाश डालने की परवाह है?

उत्तर

167

मैं तुम्हें UNION खंड के लिए देख रहे हैं, एक ला

(SELECT * from us_music where `genre` = 'punk') 
UNION 
(SELECT * from de_music where `genre` = 'punk') 
+0

धन्यवाद, काम करता है मैं वास्तव में कैसे की जरूरत है :) – Jayrox

+0

महान विचार !. एक वोट – Sagotharan

+0

@ मिहाई-limban - आपको परेशान करने के लिए खेद है, लेकिन परिणाम सेट से पहचानने का एक तरीका है कि "कौन सा परिणाम किस तालिका से आया"। Beacuse, अगर हमें इस परिणाम सेट से रिकॉर्ड को अपडेट/डिलीट करने की आवश्यकता है, तो जानने का कोई तरीका नहीं है। –

18

ऐसा लगता है कि आप एक ही मेज के साथ happer होगा लगता है। पांच में एक ही स्कीमा है, और कभी-कभी प्रस्तुत करने की आवश्यकता होती है जैसे कि वे एक टेबल पॉइंट से आते हैं ताकि इसे सभी एक टेबल में डाल दिया जा सके।

एक नया स्तंभ जोड़ें जिसका उपयोग पांच भाषाओं में अंतर करने के लिए किया जा सकता है (मुझे लगता है कि यह भाषा है जो टेबल के बीच अलग है क्योंकि आपने कहा था कि यह स्थानीयकरण के लिए था)। 4.5 मिलियन रिकॉर्ड होने की चिंता न करें। कोई वास्तविक डेटाबेस उस आकार को कोई समस्या नहीं संभाल सकता है। सही इंडेक्स जोड़ें, और आपको एक ही टेबल के रूप में उनके साथ काम करने में कोई परेशानी नहीं होगी।

+0

मूल रूप से मेरे पास एक ही टेबल में मेरा पूरा डेटा था, लेकिन लगभग 3.5 मिलियन रिकॉर्ड के बाद यह लगभग 5-10 सेकंड तक क्रॉल करना शुरू कर दिया। मैंने इसे विभाजित करने के लिए मेरे लिए सबसे अच्छा काम किया क्योंकि यह बहुत तेज था। मेरे पास अब एक नया वेबहोस्ट है, इसलिए यह बेहतर हो सकता है, लेकिन इसे – Jayrox

+23

गठबंधन करने में परेशानी का बहुत अधिक लगता है जैसे आपको टेबल पर अनुक्रमणिका जोड़ने की आवश्यकता है। –

+2

फिर, मेरी इच्छा है कि मैं टिप्पणियों को ऊपर उठा सकूं ... – staticsan

4

ऊपर जवाब में से कोई भी मान्य हैं या एक वैकल्पिक तरीका तालिका नाम का विस्तार करने के डेटाबेस नाम के रूप में अच्छी तरह से शामिल करने के लिए है - उदाहरण के लिए:

SELECT * from us_music, de_music where `us_music.genre` = 'punk' AND `de_music.genre` = 'punk' 
+0

जो आपको एक बहुत ही बीमार परिभाषित परिणाम सेट देता है: us_ और de_ punk के सभी संभावित जोड़े। –

3

स्तंभ है क्योंकि यह दोनों तालिकाओं में प्रकट होता है अस्पष्ट है आप हमें (या सॉर्ट) फ़ील्ड को पूरी तरह से निर्दिष्ट करने की आवश्यकता होगी जैसे us_music.genre या de_music.genre लेकिन यदि आप कुछ फ़ैशन में उनसे जुड़ने के लिए जाते हैं तो आप आमतौर पर दो टेबल निर्दिष्ट करेंगे। आपके साथ चलने वाली संरचना को कभी-कभी विभाजित तालिका के रूप में जाना जाता है, हालांकि आमतौर पर डेटासेट को अलग-अलग फ़ाइलों में विभाजित करने के बजाए डेटासेट को अलग-अलग विभाजित करने के बजाय किया जाता है। यदि आप डेटाबेस संरचना का प्रभारी हैं और डेटा को विभाजित करने का कोई अच्छा कारण नहीं है तो मैं एक अतिरिक्त "मूल" फ़ील्ड के साथ एक बड़ी तालिका का निर्माण करूंगा जिसमें एक देश कोड शामिल है लेकिन आप शायद इसे वैध प्रदर्शन कारण के लिए कर रहे हैं । या तो http://dev.mysql.com/doc/refman/5.0/en/union.html में रुचि रखने वाली तालिकाओं में शामिल होने के लिए या मर्ज डेटाबेस इंजन http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html का उपयोग करके संघ का उपयोग करें।

3

दोनों टेबलों को फैलाने का आपका मूल प्रयास एक अंतर्निहित जॉइन बनाता है। यह सबसे अनुभवी एसक्यूएल प्रोग्रामर द्वारा फहराया जाता है क्योंकि यह टेबल को कैसे स्थिति के साथ जोड़ा जाता है।

UNION टेबल के लिए एक अच्छा समाधान है, लेकिन ऐसा कोई कारण नहीं है कि उन्हें सभ्य अनुक्रमण के साथ एक तालिका में नहीं रखा जा सके। मैंने परिमाण के तीन आदेशों द्वारा क्वेरी तालिका को एक बड़ी तालिका में सही इंडेक्स बढ़ाने के लिए सही इंडेक्स जोड़ना देखा है।

3

union कथन विशाल डेटा में एक सौदा समय का कारण बनता है।यह 2 चरणों में चयन प्रदर्शन करने के लिए अच्छा है:

  1. आईडी
  2. चयन तो इसके साथ मुख्य तालिका का चयन
संबंधित मुद्दे