удаление нектотрых значение по условию

elven

Новичок
удаление нектотрых значение по условию

почему не работает
delete FROM aks AS a WHERE (SELECT COUNT(*) FROM fleets AS f WHERE f.group = a.id)=0
тогда как
select * FROM aks AS a WHERE (SELECT COUNT(*) FROM fleets AS f WHERE f.group = a.id)=0
работает?


или же надо поменять запрос и сделать его с использованием JOIN ?
 

pilot911

Новичок
WHERE (SELECT COUNT(*) FROM fleets AS f WHERE f.group = a.id)=0


что это за условие такое ?
 

elven

Новичок
где (количество записей из другой базы где поле А этой базы равно полю Б другой базы)=0

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

-~{}~ 11.03.09 11:45:

Есть две таблицы:

Таблица 1
id int(11),
***


Таблица 2
***
group int(11),
***


В таблице 2 в поле group может быть либо 0 (по умолчанию) либо id из таблицы 1

Мне необходимо удалить из таблицы 1 все записи, id которых не используется в поле group таблицы 2

Не получается это сделать в одном запросе
 

findnext

Новичок
почему не работает
потому что такие вещи нужно учится выполнять на уровне баз данных...

-~{}~ 11.03.09 14:46:

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

-~{}~ 11.03.09 14:49:

http://dev.mysql.com/doc/refman/6.0/en/innodb-and-mysql-replication.html

-~{}~ 11.03.09 14:53:

http://dev.mysql.com/doc/refman/6.0/en/innodb-foreign-key-constraints.html
 

elven

Новичок
Автор оригинала: findnext
потому что такие вещи нужно учится выполнять на уровне баз данных...

-~{}~ 11.03.09 14:46:


тогда и этого не бдет случаться

-~{}~ 11.03.09 14:49:

http://dev.mysql.com/doc/refman/6.0/en/innodb-and-mysql-replication.html

-~{}~ 11.03.09 14:53:

http://dev.mysql.com/doc/refman/6.0/en/innodb-foreign-key-constraints.html
у меня база на MyISAM а не InnoDB

В смысле на уровне баз данных? напрямую через консоль?
мне нужно сделать это на сайте броузерной игры, я все делаю через скрипты.

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

findnext

Новичок
elven
на уровне баз данных означает то, что базы данных могут выполнять операции независимо от языка программирования. Сюда относятся (транзакции, триггеры, процедуры и функции). Допустим если удаляешь из одной таблицы данные, которые зависят от данных из второй таблицы, то можно "запрограммировать" базу данных, чтобы она сама очищала данные из второй таблицы ( это как раз твой случай)
Всё что может и умеет база данных должна выполнять база данных, а не скрипты. Это я так на будущее.

В данном случае будет доволно сложно поменять тип таблиц с данными. Но всётаки можно. Я не настаиваю, но мне кажется что как раз для браузерных игр это оптимальный вариант.
 

elven

Новичок
спасибо за разъяснения, но ... я уже пробовал делать это

была такая ситуация: mysql сервер сильно перегружен

там часто идет lock tables потом запросы и unlock

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

рискнул переконвертировать всю базу в innoDB
потом начались проблемы, началось дублирование , многие скрипты начали стали работать неправильно. Я связал все это с переконвертацией и поменял все обратно на MyISAM

-~{}~ 12.03.09 00:15:

И все таки не удаляются записи , что делать ? мануал смотрел, сравнивал запрос, пробовал разные варианты, ни один не запустился :(
 

elven

Новичок
Автор оригинала: x-yuri
ты нашел свой запрос в мануале? Он почти как у тебя
если вы имеете в виду

DELETE а FROM aks as a LEFT JOIN fleets as f ON (a.id=f.group) WHERE f.id IS NULL

или

DELETE a, f FROM aks as a LEFT JOIN fleets as f ON (a.id=f.group) WHERE f.id IS NULL


то они все равно не выолняются
 

elven

Новичок
Спасибо большое, x-yuri твой пример очень помог, все получилось

DELETE aks FROM aks LEFT JOIN fleets ON aks.id=fleets.group WHERE fleets.group IS NULL
 
Сверху