2011-09-22 20 views
5

मुझे अपने डेटाबेस में उपयोगकर्ताओं का एक गुच्छा मिला है और मैं अपने सभी उपयोगकर्ता नाम अपने पहले नाम के पहले अक्षर, साथ ही उनके पूर्ण अंतिम नाम को रीसेट करना चाहता हूं। जैसा कि आप कल्पना कर सकते हैं, कुछ डुप्लिकेट हैं। इस परिदृश्य में, मैं उपयोगकर्ता नाम के अंत में "2" या "3" या कुछ जोड़ना चाहता हूं। इस तरह एक अद्वितीय उपयोगकर्ता नाम उत्पन्न करने के लिए मैं एक प्रश्न कैसे लिखूं?अद्वितीय और अंतिम नाम से अद्वितीय उपयोगकर्ता नाम उत्पन्न करें?

UPDATE user 
SET username=lower(concat(substring(first_name,1,1), last_name), UNIQUETHINGHERE) 

उत्तर

5
CREATE TABLE bar LIKE foo; 

INSERT INTO bar (id,user,first,last) 
(SELECT f.id,CONCAT(SUBSTRING(f.first,1,1),f.last, 
    (SELECT COUNT(*) FROM foo f2 
     WHERE SUBSTRING(f2.first,1,1) = SUBSTRING(f.first,1,1) 
       AND f2.last = f.last AND f2.id <= f.id 
     )),f.first,f.last from foo f); 

DROP TABLE foo; 
RENAME TABLE bar TO foo; 

यह एक प्राथमिक कुंजी id पर निर्भर करता है इसलिए के लिए प्रत्येक रिकॉर्ड bar में डाला, हम केवल idbar.id से भी कम समय के साथ foo में पाया डुप्लिकेट गिनती।

को देखते हुए foo:

select * from foo; 
+----+------+--------+--------+ 
| id | user | first | last | 
+----+------+--------+--------+ 
| 1 | aaa | Roger | Hill | 
| 2 | bbb | Sally | Road | 
| 3 | ccc | Fred | Mount | 
| 4 | ddd | Darren | Meadow | 
| 5 | eee | Sharon | Road | 
+----+------+--------+--------+ 

ऊपर INSERTbar में है, जिसका परिणाम:

select * from bar; 
+----+----------+--------+--------+ 
| id | user  | first | last | 
+----+----------+--------+--------+ 
| 1 | RHill1 | Roger | Hill | 
| 2 | SRoad1 | Sally | Road | 
| 3 | FMount1 | Fred | Mount | 
| 4 | DMeadow1 | Darren | Meadow | 
| 5 | SRoad2 | Sharon | Road | 
+----+----------+--------+--------+ 

"1" उपयोगकर्ता नाम के अंत से,

निकालने के लिए
INSERT INTO bar (id,user,first,last) 
(SELECT f3.id, 
     CONCAT(
      SUBSTRING(f3.first,1,1), 
      f3.last, 
      CASE f3.cnt WHEN 1 THEN '' ELSE f3.cnt END), 
     f3.first, 
     f3.last 
FROM (
    SELECT 
     f.id, 
     f.first, 
     f.last, 
     (
      SELECT COUNT(*) 
      FROM foo f2 
      WHERE SUBSTRING(f2.first,1,1) = SUBSTRING(f.first,1,1) 
      AND f2.last = f.last AND f2.id <= f.id 
     ) as cnt 
    FROM foo f) f3) 
+0

बार क्या है? अंत में ट्रिपल उद्धरण क्यों हैं? इसे थोड़ा सा समझाने की परवाह है? – mpen

+0

@ मार्क: 'बार' 'foo' जैसी खाली तालिका है। 'बार' में रिकॉर्ड्स डालने के बाद, आप 'foo' को छोड़ सकते हैं और 'bar' ->' foo' का नाम बदल सकते हैं। ट्रिपल उद्धरण पायथन का एक आर्टिफैक्ट था, जहां मैंने कोड का परीक्षण किया था। – unutbu

+0

आह। मैं सिर्फ उपयोगकर्ता तालिका को अपडेट करना चाहता था, लेकिन मुझे लगता है कि मैं इसे आसानी से वापस स्थानांतरित कर सकता हूं। यह बहुत मजेदार है। अगर यह "1" है तो मैं संख्या को भी छोड़ दूंगा, लेकिन फिर से, यह करना आसान होना चाहिए। अच्छा! आपका बहुत बहुत धन्यवाद! ** संपादित करें: ** आपकी टिप्पणी की तरह बताते हैं। – mpen

3

एक दो parter के रूप में:

SELECT max(username) 
FROM user 
WHERE username LIKE concat(lower(concat(substring(first_name,1,1),lastname), '%') 

कि नाम कॉम्बो के लिए "उच्चतम" उपयोगकर्ता नाम वापस प्राप्त करने के लिए। संख्यात्मक प्रत्यय निकालें, इसे बढ़ाएं, फिर अपने नए उपयोगकर्ता के लिए डेटाबेस में वापस डालें।

यह निश्चित रूप से दुर्लभ है। चीजें कैसे काम करती हैं, इस पर निर्भर करते हुए, समान/अंतिम नाम वाले दो उपयोगकर्ता एक-दूसरे के उपयोगकर्ता नामों पर चिपक सकते हैं। यह सुनिश्चित करने के लिए कि आप कोई उपयोगकर्ता विवादित नहीं हैं, आप निश्चित रूप से कुछ लेन-देन/लॉकिंग को प्रश्नों पर छिड़कना चाहते हैं।

+0

मैं शुद्ध MySQL के साथ ऐसा करने की उम्मीद कर रहा था ... इस सब से अधिक पाश के लिए मुझे आवश्यकता होगी: एक अतिरिक्त तालिका न कई प्रश्नों बनाने की आवश्यकता है उपयोगकर्ता, नहीं? – mpen

0

नेव rmind .... मुझे बस डुप्लीस मिला:

select LOWER(CONCAT(SUBSTRING(first_name,1,1),last_name)) as new_login,count(*) as cnt from wx_user group by new_login having count(*)>1; 

और उनको मैन्युअल रूप से सेट करें। केवल एक मुट्ठी भर था।

1

unutbu के जवाब में प्रेरित:

UPDATE USER a 
    LEFT JOIN (
     SELECT USR_ID, 
      REPLACE(
       CONCAT(
        SUBSTRING(f.`USR_FIRSTNAME`,1,1), 
        f.`USR_LASTNAME`, 
        (
         (SELECT IF(COUNT(*) > 1, COUNT(*), '') 
          FROM USER f2 
          WHERE SUBSTRING(f2.`USR_FIRSTNAME`,1,1) = 
           SUBSTRING(f.`USR_FIRSTNAME`,1,1) 
           AND f2.`USR_LASTNAME` = f.`USR_LASTNAME` 
           AND f2.`USR_ID` <= f.`USR_ID`) 
         ) 
       ), 
       ' ', 
       '') as login 
     FROM USER f) b 
    ON a.USR_ID = b.USR_ID 
    SET a.USR_NICKNAME = b.login 
+0

मैंने इसे पढ़ने योग्य बनाने के लिए पर्याप्त इंडेंटिंग जोड़ने के लिए अपनी पूरी कोशिश की, लेकिन यह क्वेरी एक राक्षस का तरीका है जिस तरह से लिखा गया है। –

+0

डाउनवोट क्यों? यह राक्षसी हो सकता है लेकिन यह काम करता है और यह लोगों की मदद कर सकता है, मुझे एक ही समस्या थी और यही वह समाधान है जो मुझे मिला, यह कम करने का विचार यह गलत है! – Batato

+0

मैंने इसे कम नहीं किया, लेकिन मूल रूप से उत्तर दिया गया, इंडेंटेशन की कमी ने इसे अपठनीय बना दिया। मैं डरता हूं यही कारण है कि। [लेकिन पूछना "क्यों डाउनवोट?" आमतौर पर यहां खराब शैली माना जाता है।] (http: //meta.stackoverflow।कॉम/प्रश्न/252826/पूछे जाने वाले कारणों के लिए-नीचे-टिप्पणियां-गैर-रचनात्मक) –

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