MySQL - एक ही संरचना लेकिन विभिन्न डेटा के साथ कई तालिकाओं से डेटा का चयन करना


79

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

समय के बहुमत केवल एक तालिका की जरूरत है और सब कुछ ठीक है। हालाँकि, कभी-कभी डेटा को 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

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

जवाबों:


177

मुझे लगता है कि आप UNION क्लॉज की तलाश में हैं, एक ला

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

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

7
@Pushpesh प्रत्येक को एक विशिष्ट स्ट्रिंग आइडेंटिफायर SELECT(SELECT 'us_music' AS from_table, * FROM us_music WHERE genre = 'punk') UNION ...
जोड़ता है

शैली का मूल्य क्या है अज्ञात है, लेकिन आईडी दो तालिकाओं में मेल खाना चाहिए? क्या आप ऐसा कुछ कर सकते हैं? (SELECT 1) AS select1 UNION (SELECT 2) AS select2 WHERE select1.id=select2.id
जुराबेब

बिल्कुल सही, क्यों मैं ढेर प्यार करता हूँ! Google, यहां पहले से ही स्टैक प्रश्न और उत्तर ढूंढें! धन्यवाद!
रोको द टैको

परिणाम सेट के UNION पर समूह द्वारा वाक्य रचना क्या है और फिर क्रम से भी करें? मान लीजिए कि यह है viewCountऔर movieTitleजहां हर महीने के लिए एक डीबी है। आप सभी 12 तालिकाओं को एक साथ जोड़ते हैं जो ठीक है, लेकिन फिर आपको आउटपुट में 12 व्यक्तिगत परिणाम सेट मिलते हैं। क्या होगा यदि आप केवल एक परिणाम सेट चाहते थे, जहां सभी परिणाम समूहीकृत थे movieTitleऔर viewCountप्रत्येक movieTitleपंक्ति के लिए मूल्य को सारांशित किया गया था ?
अनोन 58192932

19

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

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


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

26
ऐसा लगता है जैसे आपको तालिकाओं में अनुक्रमणिका जोड़ने की आवश्यकता है।
नेड बाचेल्डर

1
हां, आपने मूल समस्या (अनुचित / अपर्याप्त अनुक्रमण) को हल किए बिना समस्या के एक लक्षण का इलाज किया है। यदि आपकी 5 में से एक तालिका 4.5M पंक्तियों तक पहुँच जाती है और फिर से रेंगने लगती है तो आगे क्या होगा?
लो-टैन

5

उपर्युक्त उत्तरों में से कोई भी मान्य है, या एक वैकल्पिक तरीका है डेटाबेस नाम को शामिल करने के लिए तालिका नाम का विस्तार करना - जैसे:

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

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

4

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


3

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

UNIONतालिकाओं के लिए एक अच्छा समाधान है के रूप में वे कर रहे हैं, लेकिन बिना किसी कारण के वे सभ्य अनुक्रमण के साथ एक तालिका में नहीं रखा जा सकता होना चाहिए। मैंने परिमाण के तीन आदेशों द्वारा एक बड़ी तालिका वृद्धि क्वेरी गति में सही सूचकांक को जोड़ते हुए देखा है।


3

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

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