MySQL вопрос

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45298
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

MySQL вопрос

Сообщение Stanislav »

Есть такая задача:
1. таблица users: id, ....
2. таблица mail_lists: ..., user_id, ....
3. далеко не все юзеры принадлежат к какому-либо списку рассылки
Вопрос: как удалить лишних юзеров?
Аватара пользователя
Дима
Маньяк
Сообщения: 1455
Зарегистрирован: 15 авг 2006, 10:21
Откуда: Минск->Vancouver->Victoria

Re: MySQL вопрос

Сообщение Дима »

Что-нибудь типа такого ?
delete from users where not exists (select userId from mail_lists where userId = users.userId)
Последний раз редактировалось Дима 27 авг 2009, 13:43, всего редактировалось 1 раз.
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: MySQL вопрос

Сообщение Yury »

вообще-то говоря странная структура, по идее должны быть, типа, таблицы users, users_lists и lists, так как один пользователь может быть в разных листах, а в одном листе - разные пользователи, то двумя таблицами трудно обойтись

но если и в самом деле как ты написал, то где-то вот так:

DELETE * FROM users WHERE users.id NOT IN (SELECT user_id FROM mail_lists)
Аватара пользователя
Дима
Маньяк
Сообщения: 1455
Зарегистрирован: 15 авг 2006, 10:21
Откуда: Минск->Vancouver->Victoria

Re: MySQL вопрос

Сообщение Дима »

нашел пример: http://www.electrictoolbox.com/mysql-de ... n-another/
Надо же, даже с синтаксисом не напутал ;) По-моему, Юрин SQL тоже должен работать, если убрать * после DELETE ;)
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45298
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

Re: MySQL вопрос

Сообщение Stanislav »

А это нормально будет работать? количество строк в списках - 100000, количество юзеров - 500000.
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45298
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

Re: MySQL вопрос

Сообщение Stanislav »

Yury писал(а):вообще-то говоря странная структура, по идее должны быть, типа, таблицы users, users_lists и lists, так как один пользователь может быть в разных листах, а в одном листе - разные пользователи, то двумя таблицами трудно обойтись
но если и в самом деле как ты написал, то где-то вот так:
DELETE * FROM users WHERE users.id NOT IN (SELECT user_id FROM mail_lists)
Ну оно так и есть - просто я опустил несущественные для данной задачи поля и таблицы...
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: MySQL вопрос

Сообщение Yury »

Stanislav писал(а):
Yury писал(а):вообще-то говоря странная структура, по идее должны быть, типа, таблицы users, users_lists и lists, так как один пользователь может быть в разных листах, а в одном листе - разные пользователи, то двумя таблицами трудно обойтись
но если и в самом деле как ты написал, то где-то вот так:
DELETE * FROM users WHERE users.id NOT IN (SELECT user_id FROM mail_lists)
Ну оно так и есть - просто я опустил несущественные для данной задачи поля и таблицы...
они существенны, строго говоря, так как если так и есть, то у тебя в таблице листов не будет user_id, а будет id из промежуточной таблицы
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: MySQL вопрос

Сообщение Yury »

Дима писал(а):Юрин SQL тоже должен работать, если убрать * после DELETE ;)
бывает :oops:
я чаще селектами пробавляюсь
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45298
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

Re: MySQL вопрос

Сообщение Stanislav »

Yury писал(а):
Stanislav писал(а):
Yury писал(а):вообще-то говоря странная структура, по идее должны быть, типа, таблицы users, users_lists и lists, так как один пользователь может быть в разных листах, а в одном листе - разные пользователи, то двумя таблицами трудно обойтись
но если и в самом деле как ты написал, то где-то вот так:
DELETE * FROM users WHERE users.id NOT IN (SELECT user_id FROM mail_lists)
Ну оно так и есть - просто я опустил несущественные для данной задачи поля и таблицы...
они существенны, строго говоря, так как если так и есть, то у тебя в таблице листов не будет user_id, а будет id из промежуточной таблицы
Нет, я же написал как у меня :-)
users: id, name, email
lists: id, list_name
mail_lists: id, user_id, list_id, status
Аватара пользователя
Kate
Мудрая свинья
Сообщения: 13981
Зарегистрирован: 06 апр 2005, 07:46
Откуда: От верблюда

Re: MySQL вопрос

Сообщение Kate »

DELETE FROM users WHERE id NOT IN (SELECT userid FROM mail_lists)
можно даже DELETE FROM users WHERE id NOT IN (SELECT DISTINCT userid FROM mail_lists)
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45298
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

Re: MySQL вопрос

Сообщение Stanislav »

Отработало на удивление быстро - снесло 400000 записей меньше чем за минуту. Оно что индексирует результат подзапроса? Или пользуется существующим индексом?
Аватара пользователя
Дима
Маньяк
Сообщения: 1455
Зарегистрирован: 15 авг 2006, 10:21
Откуда: Минск->Vancouver->Victoria

Re: MySQL вопрос

Сообщение Дима »

И то, и другое. О том, как именно и что использовалсь, можно посмотреть в плане выполнения запроса: http://dev.mysql.com/doc/refman/5.0/en/ ... plain.html
Правда, насколько я вижу, EXPLAIN работает только для SELECT запросов, ну это не страшно - придется заменить DELETE на SELECT *
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: MySQL вопрос

Сообщение Yury »

Stanislav писал(а):Нет, я же написал как у меня :-)
ясно.. название промежуточной таблицы сбило с толку
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45298
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

Re: MySQL вопрос

Сообщение Stanislav »

Yury писал(а):
Stanislav писал(а):Нет, я же написал как у меня :-)
ясно.. название промежуточной таблицы сбило с толку
Сам с толку сбитый неоднократно... Я пытаюсь пофиксить супер софт из России. При удалении списка рассылки, юзеры не удаляются, но и не могут быть показаны/удалены/прилеплены в другой список никакими ихними средствами :-) Приходится через СКЛ
Аватара пользователя
Дима
Маньяк
Сообщения: 1455
Зарегистрирован: 15 авг 2006, 10:21
Откуда: Минск->Vancouver->Victoria

Re: MySQL вопрос

Сообщение Дима »

Stanislav писал(а):При удалении списка рассылки, юзеры не удаляются, но и не могут быть показаны/удалены/прилеплены в другой список никакими ихними средствами :-) Приходится через СКЛ
А в MySQL уже есть триггеры ? :) Если да, то можно наваять триггер, который будет удалять юзера при удалении последнего листа рассылки, в котором он участвует. Впрочем, это и называется "через задницу". Лучше, конечно, поправить кривой код, который создает рассылку ;)
Ответить