2016-04-20 4 views
7

का उपयोग किए बिना सर्वर पर MySQL क्वेरी क्वेरी मैंने अपने डेटाबेस के कुछ टेबल को स्थानांतरित किया जो किसी अन्य सर्वर पर यातायात के साथ परेशानी थी और फ़ेडरेटेड टेबल का उपयोग बहुत से कारणों से नहीं करना चाहता (प्रदर्शन मुख्य कारण है)। तो मुझे अपने PHP वर्ग में 2 अलग-अलग कनेक्शन बनाना है और विभिन्न सर्वरों से तालिकाओं के बीच शामिल कोड में मेरे प्रश्न दोबारा लिखना है।संघीय तालिका

उदाहरण के लिए, मेरे पास दो टेबल हैं: उपयोगकर्ता और एंटरप्राइज़ जो विभिन्न सर्वरों में हैं।

जब यह एक ही सर्वर पर था, क्वेरी था:

$rst= select group_concat(U.cod) from Users as U 
where U.codUsers in ($users) 

select name from Enterprise E 
where E.cod = $mycode and E.cod in ($rst); 

मेरा प्रश्न है, मैं ऐसा करने के तरीके simillary कर सकते हैं मैं इस किया है:

select name from Enterprise E 
inner join Users U on E.cod = U.cod 
where E.cod = $my_code and U.codUsers in ($users); 

तो मैं इस के लिए बदल दिया प्रकार का प्रश्न:

select e.name, e.datebegin, e.dateend from Enterprise E 
leftjoin (select h.callQuantity, h.history from thirdtable 
     inner join Users u on e.cod = u.cod 
     where u.codHistory in (1,2,3) 
      group by u.cod) 

मेरा प्रश्न स्पष्ट है? मेरे अंग्रेजी

+1

हाय शेरमेनो? कौन सा सर्वर "थर्डटेबल" से संबंधित है? –

+1

जो क्वेरी आप रिफैक्टर करना चाहते हैं उसे वाक्यविन्यास के साथ समस्या है: leftjoin => बाएं शामिल हों; तीसरे स्थान पर कोई उपनाम नहीं है; e.cod उप क्वेरी से संबंधित नहीं है; व्युत्पन्न तालिका में कोई उपनाम नहीं है; बिना शर्त के शामिल हो गए? –

उत्तर

10

सबसे पहले, संघीय तालिकाओं बेहतर समाधान हैं (वे उस तरह की चीज के लिए बने हैं जो आप हाथ से करने की कोशिश कर रहे हैं) के लिए खेद है। लेकिन आप उन्हें नहीं चाहते हैं, तो यहां अगली सबसे अच्छी बात है:

आपके पहले उदाहरण की तुलना में कुछ भी जटिल के लिए, आपको टेबल की बजाय तालिका सामग्री डालने से मैन्युअल रूप से एक दूरस्थ तालिका अनुकरण करना चाहिए।

मैं इस तरीके से अपना पहला उदाहरण फिर से लिखूंगा, क्योंकि आपका दूसरा उदाहरण गड़बड़ हो गया है और मुझे यह भी नहीं पता कि आप वहां क्या व्यक्त करना चाहते हैं।

select name from Enterprise E 
inner join Users U on E.cod = U.cod 
where E.cod = $my_code and U.codUsers in ($users); 

अब आप तालिका के वास्तविक डेटा के साथ तालिका की जगह ले सकता:

आप जब 1 सर्वर का उपयोग निम्न कोड था

select name from Enterprise E 
inner join 
    (  select 1 as cod, 4 as codUsers, 20 as codHistory 
    union select 2 as cod, 8 as codUsers, 500 as codHistory 
    union select 3 as cod, 29 as codUsers, 100 as codHistory 
    ) as U 
on E.cod = U.cod 
where E.cod = $my_code and U.codUsers in ($users); 

, आप का निर्माण करने के लिए है ऐसा करने के लिए स्ट्रिंग के रूप तालिका डेटा (मैं पीडीओ यहाँ उपयोग कर रहा हूँ):

foreach($db->query('select * from Users U where U.codUsers in ($users)') as $row) { 
    if($data !== '') { $data .= 'union '; } 
    $data .= 'select ' . $row['cod'] . ' as cod, ' 
      . $row['codUsers'] . ' as codUsers, ' 
      . $row['codHistory'] . ' as codHistory '; 
} 

आप अपने संपर्क के लेआउट में फिट करने के लिए है पाठ्यक्रम की ers-table (और स्ट्रिंग-कॉलम के लिए कुछ 'को न भूलें), और आप जिन स्तंभों की आवश्यकता नहीं है उन्हें छोड़ सकते हैं।

अब आप कि स्ट्रिंग जगह कहीं भी आप अपने उपयोगकर्ताओं की मेज से पहले और जैसे कि वह 1 सर्वर पर थे अपने कोड लिखने, तो आपकी पहली कोड

select name from Enterprise E 
inner join ($data) as U on E.cod = U.cod 
where E.cod = $my_code and U.codUsers in ($users); 

और अपने दूसरे कोड कैसा दिखेगा था सकते हैं (हालांकि मैं आपको याद दिलाना इसके साथ शुरू करने के लिए टूटी हुई है और 1 सर्वर पर कार्य नहीं करेगा या तो) की तरह

select e.name, e.datebegin, e.dateend from Enterprise E 
leftjoin (select h.callQuantity, h.history from thirdtable 
     inner join ($data) as u on e.cod = u.cod 
     where u.codHistory in (1,2,3) 
      group by u.cod) 

लगेगा तुम सिर्फ अपने $ डेटा-स्ट्रिंग में उपयोगकर्ताओं की एक छोटी संख्या है करने के लिए यह सुनिश्चित करना चाहिये, तो यह ठीक काम करेगा। अन्यथा, आपको वास्तव में संघीय तालिकाओं की आवश्यकता है।

+0

उत्तर आदमी के लिए धन्यवाद! मुझे यकीन है कि फेडरेट टेबल्स आसानी से इस समस्या को हल कर सकते हैं, लेकिन मुझे यह पसंद नहीं आया कि यह सुविधा कैसे काम करती है, फेडरेट टेबल्स इंडेक्स का उपयोग नहीं करते हैं, मैंने कुछ दिन पहले टेस्ट बनाया था और क्वेरी का प्रदर्शन घृणित था। लेकिन वास्तव में आपके उत्तर के लिए धन्यवाद, मुझे बहुत मदद की! – Shermano

1

योजना:

डेटा कि एक मशीन से की आवश्यकता हो सकती लायें; परिणामसेट को एक सहयोगी सरणी में डाल दें।

इसी तरह दूसरी मशीन के लिए भी करें। (और तीसरा ...)

दो सरणी के साथ खेलो।

योजना बी (अपने पहले मामले के समान):

डेटा कि एक मशीन से की आवश्यकता हो सकती लायें; परिणामसेट को एक सहयोगी सरणी में डाल दें।

IN (...) बनाएं; इसे दूसरी मशीन के लिए क्वेरी में जोड़ें।

दूसरी मशीन से प्राप्त करें।

(आदि)

परिणाम के साथ खेलो।

प्लान बी को 'अनुकूलित' किया जा सकता है यदि आपको पता है कि कौन सी मशीन का सबसे छोटा परिणाम होगा, और इसके साथ शुरू होगा।

PHP में सरणी कार्यों का भरपूर धन है, जिससे कई कुशलताएं आसान हो जाती हैं।

+0

धन्यवाद आदमी, मैं यहां एक समान समाधान की कोशिश कर रहा हूं, वास्तव में धन्यवाद! – Shermano

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