2011-01-17 2 views
0

У меня есть таблица в MySQL со следующими даннымиMySql Update Query

NAME SEX 
A  Male 
B  Female 
C  Male 
A  Null 
B  Null 
C  Null 
D  Null 

как я могу обновить SEX от предыдущих строк?

Выход:

NAME SEX 
A  Male 
B  Female 
C  Male 
A  Male 
B  Female 
C  Male 
D  Null 

Заранее спасибо

+1

Как бы вы хотели, чтобы значения были? Пример ожидаемого результата поможет ... –

+0

Вопрос не ясен, вы хотите, чтобы вы обновили 'A', который является нулевым от другого' A', который имеет значение? – VoodooChild

ответ

3

Если имя может иметь только один пол, вы можете обновить все другие имена, которые не имеют секса еще как:

update YourTable yt1 
join (
     select name 
     ,  max(sex) as maxSex 
     from YourTable 
     group by 
       name 
     ) yt2 
on  yt1.name = yt2.name 
     and yt2.maxSex is not null 
set  yt1.sex = yt2.maxSex 
where yt1.sex is null; 

в вашем примере, это будет заполнять пол для каждой строки, кроме D, так как не существует никаких записей с именем D и ненулевым пола.

+0

Он отлично работает. Но есть интересная вещь. После выполнения этого запроса, когда я обновляю любую запись в таблице вручную в любой среде IDE, она автоматически обновляет все строки. Скажите, пожалуйста, почему? – Novice

+0

@Novice: запрос обновления не имеет эффекта после его завершения. Проверьте, есть ли триггеры на вашем столе? – Andomar

+0

Я проверил триггеры. Я создаю еще один db и вижу, что происходит – Novice

1

Если вы хотите установить Male на всех полях, где Null, просто запустите простой обновление:

UPDATE table SET SEX='Male' WHERE SEX IS NULL 

Если вы хотите сделайте это автоматически, вы должны вставить инкрементный индексный столбец для ссылки в вашем скрипте.

0

Если я правильно понимаю, что вы хотите сделать, запрос, как это будет хорошо

UPDATE TABLE T SET SEX = (SELECT SEX из таблицы, где NAME = T.NAME LIMIT 1);

но MySQL не может использовать в подзапросе таблица используется в обновлении, так что вы должны использовать некрасивый трюк, как этот:

MySQL Error 1093 - Can't specify target table for update in FROM clause