Rumah  >  Soal Jawab  >  teks badan

Cara untuk mengemas kini keseluruhan lajur menggunakan indeks baris dan nilai berkod keras dalam Mysql

<p>Saya ingin mengemas kini keseluruhan lajur <strong>e-mel</strong> menggunakan format indeks baris + email@gmail.com. </p> <p>Ini ialah data dalam jadual saya</p> <table class="s-table"> <kepala> <tr> <th>id</th> <th>E-mel</th> </tr> </kepala> <tbody> <tr> <td>12</td> <td>abc@gmail.com</td> </tr> <tr> <td>23</td> <td>pqr@gmail.com</td> </tr> </tbody> </table> <p>Ini adalah output yang saya mahu</p> <table class="s-table"> <kepala> <tr> <th>id</th> <th>E-mel</th> </tr> </kepala> <tbody> <tr> <td>12</td> <td>1email@gmail.com</td> </tr> <tr> <td>23</td> <td>2email@gmail.com</td> </tr> </tbody> </table> <p>Saya mencuba pertanyaan di bawah tetapi tidak mendapat output yang saya jangkakan. </p> <pre class="brush:php;toolbar:false;">;dengan C sebagai ( pilih e-mel,row_number() over(order by id asc) sebagai rowid daripada cus ) kemas kini C tetapkan e-mel = rowid+'email@gmail.com'</pre> <p>Itu bukan hanya 3 baris, saya mempunyai lebih 500 baris dalam jadual <kod>cus</code> Adalah lebih baik jika seseorang boleh memberi saya penyelesaian yang tidak memerlukan gelung. Tolong bantu saya membuat pertanyaan SQL. Terima kasih. </p>
P粉362071992P粉362071992392 hari yang lalu383

membalas semua(2)saya akan balas

  • P粉201448898

    P粉2014488982023-08-27 14:25:34

    Ini nampaknya berkesan, tetapi saya percaya ada penyelesaian yang lebih elegan yang tidak memerlukan penggunaan join...

    SELECT  * FROM cus ;
    
    update
    cus  inner join 
    (
    select  id ,email,row_number() over(order by id asc) as rowid
    from cus       
    )a
     on a.id = cus.id
    set cus.email = concat(a.rowid, a.email)  
    ;
    
    SELECT  * FROM cus ;

    Ujian Penuh

    -- 创建表
    CREATE TABLE cus (
      id INTEGER PRIMARY KEY,
      email TEXT NOT NULL
    
    );
    
    -- 插入数据
    INSERT INTO cus VALUES (0021, 'Clark');
    INSERT INTO cus VALUES (0402, 'Dave');
    INSERT INTO cus VALUES (005, 'Ava' );
    
    
    SELECT  * FROM cus ;
    
    update
    cus  inner join 
    (
    select  id ,email,row_number() over(order by id asc) as rowid
    from cus       
    )a
     on a.id = cus.id
    set cus.email = concat(a.rowid, a.email)  
    ;
    
    SELECT  * FROM cus ;

    balas
    0
  • P粉885035114

    P粉8850351142023-08-27 00:04:35

    Mungkin ini yang anda mahu lakukan:

    WITH C AS
    (
      SELECT email,ROW_NUMBER() OVER(ORDER BY id ASC) AS rowid
      FROM cus       
    )
    UPDATE cus 
     JOIN C
     ON cus.email=C.email
     SET cus.email=CONCAT(rowid,'email@gmail.com');

    Sambungkan jadual (cus)与Ccte) yang anda ingin kemas kini, dan kemudian kemas kini dengan sewajarnya.

    Berikut ialah demo

    @QisM memang bukan unik untuk email不唯一时的语法提出了疑虑,由于OP没有提到,我同意如果email, ini bukan penyelesaiannya. Jadi saya mengubah suai sedikit sintaks:

    WITH C AS
    (
      SELECT id, email, ROW_NUMBER() OVER(ORDER BY id ASC) AS rowid
      FROM cus       
    )
    UPDATE cus 
     JOIN C
     ON cus.id=C.id AND cus.email=C.email
     SET cus.email=CONCAT(rowid,'email@gmail.com');

    Semak sekarangcte带有id,并且在JOIN C ON ..条件中,我添加了匹配id. Selepas ujian, ini akan membetulkan isu jika e-mel itu bukan unik.

    balas
    0
  • Batalbalas