Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Добрый день,
необходимо найти в таблице совпадающие строки скажем u_name, после чего скопировать u_email там где нет его в совпадающих u_name. Проще говоря нужно найти совпадающие строки и заменить пустые в них колонки полными.
пример Таблица User
u_id | u_name | u_email
1 | title1 | desc11
2 | title1 |
3 | title2 | desc22
4 | title3 | desc33
5 | title4 | desc44
6 | title4 |
вот что то подобное получилось сделать
UPDATE user q INNER JOIN (SELECT * FROM user WHERE u_name IN (SELECT u_name FROM user GROUP BY u_name HAVING count(u_name)>1)) s SET q.u_email=s.u_email,q.u_pass=s.u_pass WHERE q.u_name=s.u_name AND (q.u_email='' OR q.u_pass='')
всё бы хорошо, НО! при таблице в 2к+ записей этот запрос вешает mySQL. В чём тут беда, не судите строго за запрос я тока учусь.
заранее спс.
Отредактированно youstm (24.06.2010 13:28:23)
Неактивен
изменил запрос так:
UPDATE user q INNER JOIN (SELECT * FROM user GROUP BY u_name HAVING count(u_name)>1) s ON (s.u_email!='') SET q.u_email=s.u_email,q.u_pass=s.u_pass WHERE q.u_name=s.u_name AND (q.u_email='' OR q.u_pass='')
SQL выдал следующее: Затронуто строк: 199 (запрос занял 6.5336 сек.)
в таблице было около 7000 записей... ну теперь хоть не завис.. но всё равно мне кажется долго что то 6.5 секунд..
Неактивен
Ох. Обычно в ON пишут условия связи, это не просто странное место для размещения
WHERE
6 секунд — вполне нормальное время для плохого одноразового запроса. Что Вас
смущает?
Неактивен
Ох. Обычно в ON пишут условия связи, это не просто странное место для размещения
WHERE smile
Т.е. ON (s.u_email!='') нет смысла так делать?
6 секунд — вполне нормальное время для плохого одноразового запроса. Что Вас
смущает?
да запускается раз в день... а как его сделать не ПЛОХИМ а ХОРОШИМ)))..
Неактивен
Исправьте приложение, которое вставляет эти строки? Будет куда лучше.
UPDATE user u
JOIN (SELECT u_name, MAX(u_pass) AS u_pass FROM user GROUP BY u_name) uq USING (u_name)
SET u.u_pass = uq.u_pass;
Такому запросу нужен ключик на (u_name, u_pass).
Неактивен
MAX(u_pass) выберет строку та что не пустая?
Неактивен
Проверьте
Неактивен
Страниц: 1