2012-03-07 18 views
6

के विशिष्ट रिकॉर्ड अपडेट करें मैं फोन सिस्टम से निपट रहा हूं और कई सेवा विक्रेताओं के साथ काम करना है। एक विक्रेता के लिए मैं इस तरह एक MySQL तालिका country_codes है -MySQL तालिका

--------------------------------------------------------- 
country_code | area_code | country 
--------------------------------------------------------- 
93   | 93   | Afghanistan 
0    | 9375  | Afghanistan Cellular-AT 
0    | 9370  | Afghanistan Cellular-AWCC 
355   | 355  | Albania 
0    | 35568  | Albania Cellular-AMC 
0    | 35567  | Albania Cellular-Eagle 
213   | 213  | Algeria 
0    | 21377  | Algeria Cellular-Djezzy 
0    | 2135  | Algeria Cellular-Wataniya 
--------------------------------------------------------- 

और इतने पर ...

COUNTRY_CODE स्तंभ वहाँ नहीं से पहले था, लेकिन मैं यह जोड़ा के बाद से मैं अपने PHP आवेदन के लिए यह आवश्यक। मैंने कुछ रिकॉर्ड्स के लिए देश कोड अपडेट करने में कामयाब रहे (यहां मेरे पिछले प्रश्न से उत्तर का उपयोग कर)

जो मैं प्राप्त करना चाहता हूं वह संबंधित देश कोड के साथ 0 को प्रतिस्थापित करना है। तो तालिका इस तरह दिखनी चाहिए -

--------------------------------------------------------- 
country_code | area_code | country 
--------------------------------------------------------- 
93   | 93   | Afghanistan 
93   | 9375  | Afghanistan Cellular-AT 
93   | 9370  | Afghanistan Cellular-AWCC 
355   | 355  | Albania 
355   | 35568  | Albania Cellular-AMC 
355   | 35567  | Albania Cellular-Eagle 
213   | 213  | Algeria 
213   | 21377  | Algeria Cellular-Djezzy 
213   | 2135  | Algeria Cellular-Wataniya 
--------------------------------------------------------- 

मुझे उम्मीद है कि मैंने खुद को काफी समझाया है। कोई विचार है कि मैं PHP-MySQL के साथ ऐसा कैसे कर सकता हूं?

,

+0

आप देश_code (क्षेत्र_code का हिस्सा आपका देश_Code है) को पॉप्युलेट करने के लिए क्षेत्र_code और country_code के बीच संबंध का उपयोग कर सकते हैं –

+0

मुझे थोड़ी अधिक जानकारी चाहिए। हम कैसे बता सकते हैं कि वैध देश कोड क्या बनाता है? चूंकि वे कभी-कभी 2-अंक और कभी-कभी 3-अंक होते हैं, इसलिए हम केवल क्षेत्र कोड के अंत को काट नहीं सकते हैं। क्या आपके पास पहले से ही 28,000 रिकॉर्ड में कम से कम एक बार दर्ज किए गए सभी वैध देश कोड हैं? – Andrew

+0

ऐसा लगता है कि प्रत्येक "कंपनी" में एक क्षेत्र कोड होता है जो "देश" को निर्दिष्ट क्षेत्र कोड से शुरू होता है? क्या यह पैटर्न पूरे डेटासेट के साथ काम करता है? –

उत्तर

6

इस क्वेरी का प्रयास करें -

UPDATE country_codes 
SET country_code := @c := IF(@c IS NOT NULL AND country_code = 0, @c, country_code) 
ORDER BY CAST(area_code AS CHAR) 
+0

country_code कम से कम 1 अंक और अधिकतम 4 अंक – skos

+0

सबस्ट्रिंग (क्षेत्र_code, 1, 3) 3 वर्ण (अंक) अधिक नहीं लौटाएगा। यह भी emp वापस करेगा खाली 'area_code' के मामले में ty स्ट्रिंग। क्या आपके पास 'area_code' खाली है? – Devart

+0

कोई 'area_code' खाली नहीं हो सकता – skos

0

कुछ इस तरह काम करना चाहिए (मैं तालिका इस तरह से हेरफेर करने के लिए PHP कोड का उपयोग कर कोई आपत्ति नहीं है) यह सोचते हैं आप एक डेटाबेस "testdb" कहा जाता है, और एक मेज "footable" कहा जाता है।

$link = mysql_connect("localhost", "username", "password1234"); 
mysql_select_db("testdb", $link); 

$result = mysql_query("UPDATE footable SET country_code="93" WHERE country LIKE Afghanistan%", $link); 
$result = mysql_query("UPDATE footable SET country_code="355" WHERE country LIKE Albania%", $link); 

mysql_close($link); 
+1

मुझे विश्वास है कि यह @Sachyn के लिए क्या पूछ रहा है के विपरीत है। –

+0

@ एडम, उस तालिका में कई और देश हैं, जो उन्होंने दिखाया है केवल नमूना डेटा है। –

+0

@ नवीन कुमार एक पंक्ति के मामले पर विचार करें जहां देश "यूके-ऑरेंज" और देश-कोड i 0 है, लेकिन केवल मौजूदा प्रविष्टि "यूनाइटेड किंगडम" है ... यदि डेटा सरल और अनुमानित है तो स्वचालित "अनुमान" दृष्टिकोण लिया जा सकता है - लेकिन यह शायद ही कभी असली दुनिया में होता है। – Adam

2
update cc set 
    country_code = t.country_code 
from country_codes cc 
join (
    select country_code, country, char_length(trim(cast(country_code as char))) as code_len 
    from country_codes 
    where country_code <> 0 
) t on 
    t.country_code = cast(substr(cast(cc.area_code as char), 1, t.code_len) as signed integer) and 
    cc.country_code = 0 and 
    cc.country like concat(t.country, '%') 

मैं cc.country like concat(t.country, '%') जोड़ दिया है, वह अधिक विशिष्ट हालत के लिए, लेकिन यह मान लिया गया है कि प्रत्येक सेलुलर नेटवर्क नाम अपने देश के नाम के साथ शुरू होता है - इसलिए यह सच न आना यह नहीं है यदि।

जोड़ा गया @Sachyn टिप्पणी के बाद:

टेस्ट SQLZOO पर इस्तेमाल किया कोड ठीक काम करता है, यह परीक्षण के लिए ही है, यह एक अद्यतन क्वेरी नहीं है:

select cc.*, t.country_code as new_country_code 
from (
    select 93 as country_code, 93 as area_code , 'Afghanistan' as country union 
    select 0 , 9375 , 'Afghanistan Cellular-AT' union 
    select 0 , 9370 , 'Afghanistan Cellular-AWCC' union 
    select 355, 355 , 'Albania' union 
    select 0 , 35568, 'Albania Cellular-AMC' union 
    select 0 , 35567, 'Albania Cellular-Eagle' union 
    select 213, 213 , 'Algeria' union 
    select 0 , 21377, 'Algeria Cellular-Djezzy' union 
    select 0 , 2135 , 'Algeria Cellular-Wataniya' 
) cc 
join (
    select country_code, country, char_length(rtrim(cast(country_code as char))) as code_len 
    from (
     select 93 as country_code, 93 as area_code , 'Afghanistan' as country union 
     select 0 , 9375 , 'Afghanistan Cellular-AT' union 
     select 0 , 9370 , 'Afghanistan Cellular-AWCC' union 
     select 355, 355 , 'Albania' union 
     select 0 , 35568, 'Albania Cellular-AMC' union 
     select 0 , 35567, 'Albania Cellular-Eagle' union 
     select 213, 213 , 'Algeria' union 
     select 0 , 21377, 'Algeria Cellular-Djezzy' union 
     select 0 , 2135 , 'Algeria Cellular-Wataniya' 
    ) c 
    where country_code <> 0 
) t on 
    t.country_code = cast(substr(cast(cc.area_code as char), 1, t.code_len) as signed integer) and 
    cc.country_code = 0 and 
    cc.country like concat(t.country, '%') 
+0

धन्यवाद मीकल मैंने कोशिश की, लेकिन यह मुझे यह त्रुटि देता है '# 1064 - आपको अपने SQL वाक्यविन्यास में कोई त्रुटि है; देश_कॉम सीसी में शामिल होने के लिए सही वाक्यविन्यास के लिए अपने MySQL सर्वर संस्करण से मेल खाने वाले मैन्युअल की जांच करें (देशकोड, देश, char_length (ट्रिम करें '' लाइन 3' – skos

+0

पर यह सही दृष्टिकोण है कि निर्दिष्ट धारणाएं सही हैं - आपको इसे काम करने के लिए सिंटैक्स के साथ खेलना होगा। – Stevo

+0

@Sachyn क्या आप इस क्वेरी का उपयोग करते हैं? मैंने इसका परीक्षण किया है और ठीक काम करना चाहिए। मेरा आखिरी संस्करण शायद इस समय कुछ बदल गया है। –

0

आप countries पर एक टेबल बना सकते हैं ly, यानी .:

INSERT INTO countries (country_code,country) 
SELECT country_code,country FROM country_codes WHERE country_code=0 

तो आप आसानी से अपने तालिका

UPDATE country_codes cc, countries c 
SET cc.country_code = c.country_code 
WHERE LOCATE(c.country,cc.country)=1 AND cc.country_code=0 

मैं इस परीक्षण नहीं किया अद्यतन कर सकते हैं, लेकिन मेरा मानना ​​है कि आप बिंदु मिल सकती है। ,

0) बैकअप आपके डेटा, या बेहतर डेटा की प्रतिलिपि पर क्वेरी चलाने:

1

आप ठीक डेटा केवल एक बार करने की जरूरत है, तो आप इस दृष्टिकोण की कोशिश कर सकते।

1) एक सारणी बनाता है जिसमें गैर-शून्य देश कोड शामिल हैं। हम अलग मेज की जरूरत है, क्योंकि यह MySQL के मैनुअल में कहा गया है कि:

वर्तमान में, आप एक मेज अद्यतन नहीं कर सकते और एक सबक्वेरी में एक ही मेज से का चयन करें।

CREATE TABLE country_codes_list (
    country_code INT NOT NULL PRIMARY KEY 
); 

INSERT INTO country_codes_list 
SELECT country_code 
FROM country_codes 
WHERE country_code <> 0; 

2) सभी पंक्तियों जहां देश कोड क्षेत्र कोड की शुरुआत से मेल खाता है कि देश कोड का पता लगाकर 0 अपडेट करें: क्योंकि यह का उपयोग करता है

UPDATE country_codes AS country_codes_zero SET country_code = (
    SELECT country_code 
    FROM country_codes_list 
    WHERE country_codes_list.country_code = SUBSTRING(country_codes_zero.area_code, 1, LENGTH(country_codes_list.country_code)) 
) WHERE country_code = 0; 

यह एक बहुत ही धीमी गति से क्वेरी हो सकता है एक सह-संबंधित उप-क्वेरी। लेकिन इसे एक ही समय में डेटा को ठीक करना चाहिए।