Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: помогите с DELET'om
 
 автор: doddoindan   (10.04.2008 в 12:13)   письмо автору
 
 

есть такой запрос


delete from vacancies v
 WHERE  id  in (select id from vacancies where regionid=20 AND v.dopinfo=dopinf AND v.profession=profession) AND 
NOT id in (select max(id) from vacancies where regionid=20 AND v.dopinfo=dopinf AND v.profession=profession)


выдаёт ошибку, собственно вопрос - такую конструкцию в mysql в делит запихнуть нельзя (т.к. в firebird'e работает отлично), и можно ли как-то это обойти, кроме как повыбирать вначале айдишники, а потом их пихать вммето запросов в delete

   
 
 автор: ronin80   (10.04.2008 в 12:24)   письмо автору
 
   для: doddoindan   (10.04.2008 в 12:13)
 

delete from vacancies v
WHERE id in (select id from vacancies where regionid=20 AND v.dopinfo=dopinf AND v.profession=profession) AND
id NOT in (select max(id) from vacancies where regionid=20 AND v.dopinfo=dopinf AND v.profession=profession)

неправильно писать NOT id in, надо id not in

   
 
 автор: doddoindan   (10.04.2008 в 12:32)   письмо автору
 
   для: ronin80   (10.04.2008 в 12:24)
 

забыл написать - ошибку он выдаёт следующую

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id in (select id from vacancies where regionid=20 AND v.dopinfo=dopinfo ' at line 2

   
 
 автор: ronin80   (10.04.2008 в 12:48)   письмо автору
 
   для: doddoindan   (10.04.2008 в 12:32)
 

проверил мой вариант?

   
 
 автор: doddoindan   (10.04.2008 в 13:18)   письмо автору
 
   для: ronin80   (10.04.2008 в 12:48)
 

ага, не помгло, ругается раньше, на первое условие

   
 
 автор: mechanic   (10.04.2008 в 12:54)   письмо автору
 
   для: doddoindan   (10.04.2008 в 12:32)
 

у тя тут какая то вообще каша получилась.. видимо ты пытаешься как то поджойнить табличку саму с собой 2 раза
но могу сказать что "v" передать внутрь вложенного запроса вот так просто нельзя
указанная ошибка скорее всего ругается на "v", которую ты не юзаешь на своем уровне (вместе с "id in" и "id not in")
лучше объясни задачу и составим нормальный запрос

   
 
 автор: doddoindan   (10.04.2008 в 13:17)   письмо автору
 
   для: mechanic   (10.04.2008 в 12:54)
 

задача - удалтиь из таблицы повторяющиеся записи и оставить только одну из них,

ругается на "v", которую ты не юзаешь на своем уровне (вместе с "id in" и "id not in") - это я заметил и поправил - не помгло

кпросто пересел с firebirda, там это работало на ура

upd - всего разобрать надо 17 000 записей из них уникальных останется около 3 000

   
 
 автор: ronin80   (10.04.2008 в 13:23)   письмо автору
 
   для: doddoindan   (10.04.2008 в 13:17)
 

допустим если таблица такого вида table (id первичный ключ, column char)
тогда примерно так

delete from table
where column in (select column from table as t group by t.column having count(*)>1)
and id not in (select max(t.id) as id from table as t group by t.id )

попробуй так, таким образом будут удалены все повторяющиеся строки кроме последней из повторяющихся, соответственно заменив функцию max на другое условие можно выбирать какие записи оставлять в таблице

   
 
 автор: doddoindan   (10.04.2008 в 13:35)   письмо автору
 
   для: ronin80   (10.04.2008 в 13:23)
 



>delete from table
>where column in (select column from table as t group by t.column having count(*)>1)
>and id not in (select max(t.id) as id from table as t group by t.id )



вот в этой строчке у тебя выбирается просто максимальный id в таблице, а как сделать так, чтобы это условие знало какие сейчас проверяются значения т.е. во втором условии должно быть что-то типа where t.column=tt.column

   
 
 автор: ronin80   (10.04.2008 в 13:42)   письмо автору
 
   для: doddoindan   (10.04.2008 в 13:35)
 

я не очень понял

" чтобы это условие знало какие сейчас проверяются значения т.е. во втором условии должно быть что-то типа where t.column=tt.column "

как это должно выглядеть?

   
 
 автор: doddoindan   (10.04.2008 в 13:57)   письмо автору
 
   для: ronin80   (10.04.2008 в 13:42)
 

ну смотри что делает сейчас твой запрос

1е условие - выбирает все записи в которых заданное поле повторяется
2е условие - всегда возвращает максимальный id из талицы

хау итс ворк?)

   
 
 автор: ronin80   (10.04.2008 в 14:21)   письмо автору
 
   для: doddoindan   (10.04.2008 в 13:57)
 

delete from table
where column in (select column from table as t group by t.column having count(*)>1)
and id not in (select max(t.id) as id from table as t group by t.id )

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

можно ещё второе условие изменить:

and id <> (select max(t.id) as id from table as t group by t.id )

   
 
 автор: doddoindan   (10.04.2008 в 14:29)   письмо автору
 
   для: ronin80   (10.04.2008 в 14:21)
 

а надо чтобы удаляло все повторяющиеся
и id которых не равняется максимальному id из группы повторяющихся (а не из все таблицы)...

   
 
 автор: doddoindan   (10.04.2008 в 14:54)   письмо автору
 
   для: ronin80   (10.04.2008 в 14:21)
 

да и так не проканает так как мне надо проверять запись на дубляж двух столбцов

   
 
 автор: mechanic   (10.04.2008 в 16:11)   письмо автору
 
   для: doddoindan   (10.04.2008 в 13:17)
 

че то красивый запрос не рожается..
может тебя устроит в 2 этапа
select dopinfo, profession, max(id) as maxid from vacancies where regionid=20 group by 1,2

а потом
delete from vacancies where regionid=20 and id not in ("те id что мы выбрали тока что")



а хотя не!
в один запрос они отлично объединяются!
delete from vacancies where regionid=20 and id not in (select max(id) as maxid from vacancies where regionid=20 group by dopinfo, profession)

   
 
 автор: doddoindan   (10.04.2008 в 16:42)   письмо автору
 
   для: mechanic   (10.04.2008 в 16:11)
 

>а хотя не!
>в один запрос они отлично объединяются!
>
delete from vacancies where regionid=20 and id not in (select max(id) as maxid from vacancies where regionid=20 group by dopinfo, profession)


смысл тотоже что и у меня в первом посте, только красивее) проблема в том что сервер ругается на вложенный селект в делете...

ну вообщем я уже всё сделал скриптом) спасибо за помощь

   
 
 автор: mechanic   (10.04.2008 в 16:47)   письмо автору
 
   для: doddoindan   (10.04.2008 в 16:42)
 

старый мускуль?
у меня на 5.0-м все ок

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования