2016-04-13 17 views
-3

Bu konuda bana yardımcı olmanızı isterim, bununla ilgili küçük bir sorunum var, ancak bunu nasıl düzeltebileceğimi bilmiyorum, temel olarak duplicatedusernameid adını güncellemek istiyorum ve kullanıcı veritabanına güncelleyin. BuradaMySQL içinden SELECT to UPDATE

UPDATE users SET duplicatedusernameid = (SELECT CONCAT(first_name,middle_name,last_name) 
,COUNT(*)-1 AS duplicatedusernameid HAVING COUNT(*) > 1) WHERE id = 1 

Ve çalışma SEÇ işlev, bunun yerine seçme I yukarıdaki gibi, UPDATE istiyoruz ama bu bir işe yaramaz: İşte benim kodudur. Böylece temelde duplicatedusernameid değerini almak ve güncellemek istiyorum

SELECT CONCAT(first_name,middle_name,last_name),COUNT(*)-1 AS duplicatedusernameid 
FROM users HAVING COUNT(*) > 1 

: İşte SEÇ kodudur.

+0

tanımla "çalışmıyor". Bu ne işe yarıyor? – David

+0

@David Okay, temel olarak ne yapar, ilk, orta ve soyadı alır ve çiftleri (kaç kişi aynı ada sahip) alırsa, o zaman bunu kullanıcı tablosuna güncellemek isterim. aynı adada kaç tane var. BTW yukarıdaki sistem aslında ayırt edebilir ve kullanıcı dos bir orta isim yoksa, sadece boş olacak ve sadece ilk isim ve soyadı değeri olsun ve daha sonra aynı ada sahip kaç tane kontrol edecektir. bu mantıklı mı? –

+0

UPDATE ** tüm ** kopyalarını veya sadece ** belirli bir ** olmasını ister misiniz? "SELECT" deyiminde "WHERE" yan tümcesi belirtmezsiniz ve "UPDATE" deyiminizde "WHERE id = 1" ifadesine sahip olursunuz, bu yüzden kafa karıştırıcıdır. Tüm bunları doğru şekilde yeniden yazınız, lütfen ve bir hata olduğunda, bu soruya hata mesajını eklemek her zaman iyi bir fikirdir. –

cevap

0

Böyle bir SQL deyimi kullanabilirsiniz:

update users a 
inner join (
    -- get the count for a user 
    SELECT first_name, middle_name, last_name, COUNT(*)-1 AS duplicatedusernameid 
    from users 
    group by first_name, middle_name, last_name 
) b 
    on a.first_name = b.first_name 
    and a.middle_name = b.middle_name 
    and a.last_name = b.last_name 
set a.duplicatedusernameid = b.duplicatedusernameid 
where a.id = 1; 

Tablo

create table users (
    id int, 
    first_name varchar(100), 
    middle_name varchar(100), 
    last_name varchar(100), 
    duplicatedusernameid varchar(100) 
); 

insert into users (id, first_name, middle_name, last_name) values 
(1, 'John', '', 'Smith'), 
(2, 'John', '', 'Smith'), 
(3, 'Jessie', '', 'Marcus'), 
(4, 'Jessie', '', 'Marcus'), 
(5, 'Jessie', '', 'Marcus'), 
(6, 'Don', '', 'Kassieth'); 

Sonuçları (eğer kaldırırsanız nerede fıkra)

| id | first_name | middle_name | last_name | duplicatedusernameid | 
|----|------------|-------------|-----------|----------------------| 
| 1 |  John |    |  Smith |     1 | 
| 2 |  John |    |  Smith |     1 | 
| 3 |  Jessie |    | Marcus |     2 | 
| 4 |  Jessie |    | Marcus |     2 | 
| 5 |  Jessie |    | Marcus |     2 | 
| 6 |  Don |    | Kassieth |     0 | 

Açıklama

SELECT first_name, middle_name, last_name, COUNT(*)-1 AS duplicatedusernameid 
from users 
group by first_name, middle_name, last_name 

yukarıdaki SQL deyimi her benzersiz, ilk, orta ve soyadı kombinasyonu için sayım alacak. having count(*) > 1'un group by maddesinin altına ekleyerek bunu kısa listeye alabilirsiniz.

Daha sonra, kullanıcı tablosuna ilk, orta ve soyadı kombinasyonuna dayanan bu sayımla ilgili tablo ile katılıyoruz. Bir eşleşme varsa, kullanıcı tablosundaki alınan sayıyı güncelleyin.

SQLFiddle

http://sqlfiddle.com/#!9/c43ea/1