MySQL вопрос
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- Stanislav
- Mr. Minority Report
- Сообщения: 45298
- Зарегистрирован: 19 окт 2005, 16:33
- Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo
MySQL вопрос
Есть такая задача:
1. таблица users: id, ....
2. таблица mail_lists: ..., user_id, ....
3. далеко не все юзеры принадлежат к какому-либо списку рассылки
Вопрос: как удалить лишних юзеров?
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)
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 вопрос
вообще-то говоря странная структура, по идее должны быть, типа, таблицы users, users_lists и lists, так как один пользователь может быть в разных листах, а в одном листе - разные пользователи, то двумя таблицами трудно обойтись
но если и в самом деле как ты написал, то где-то вот так:
DELETE * FROM users WHERE users.id NOT IN (SELECT user_id FROM mail_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 вопрос
А это нормально будет работать? количество строк в списках - 100000, количество юзеров - 500000.
- Stanislav
- Mr. Minority Report
- Сообщения: 45298
- Зарегистрирован: 19 окт 2005, 16:33
- Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo
Re: MySQL вопрос
Ну оно так и есть - просто я опустил несущественные для данной задачи поля и таблицы...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 вопрос
они существенны, строго говоря, так как если так и есть, то у тебя в таблице листов не будет user_id, а будет id из промежуточной таблицы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 вопрос
бываетДима писал(а):Юрин SQL тоже должен работать, если убрать * после DELETE

я чаще селектами пробавляюсь
- Stanislav
- Mr. Minority Report
- Сообщения: 45298
- Зарегистрирован: 19 окт 2005, 16:33
- Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo
Re: MySQL вопрос
Нет, я же написал как у меняYury писал(а):они существенны, строго говоря, так как если так и есть, то у тебя в таблице листов не будет user_id, а будет id из промежуточной таблицыStanislav писал(а):Ну оно так и есть - просто я опустил несущественные для данной задачи поля и таблицы...Yury писал(а):вообще-то говоря странная структура, по идее должны быть, типа, таблицы users, users_lists и lists, так как один пользователь может быть в разных листах, а в одном листе - разные пользователи, то двумя таблицами трудно обойтись
но если и в самом деле как ты написал, то где-то вот так:
DELETE * FROM users WHERE users.id NOT IN (SELECT user_id FROM mail_lists)

users: id, name, email
lists: id, list_name
mail_lists: id, user_id, list_id, status
- Kate
- Мудрая свинья
- Сообщения: 13981
- Зарегистрирован: 06 апр 2005, 07:46
- Откуда: От верблюда
Re: MySQL вопрос
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)
можно даже 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 вопрос
Отработало на удивление быстро - снесло 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 *
Правда, насколько я вижу, EXPLAIN работает только для SELECT запросов, ну это не страшно - придется заменить DELETE на SELECT *
- Yury
- The L'ony
- Сообщения: 26202
- Зарегистрирован: 22 янв 2004, 13:48
- Откуда: Мирный -> Vancouver
- Контактная информация:
Re: MySQL вопрос
ясно.. название промежуточной таблицы сбило с толкуStanislav писал(а):Нет, я же написал как у меня
- Stanislav
- Mr. Minority Report
- Сообщения: 45298
- Зарегистрирован: 19 окт 2005, 16:33
- Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo
Re: MySQL вопрос
Сам с толку сбитый неоднократно... Я пытаюсь пофиксить супер софт из России. При удалении списка рассылки, юзеры не удаляются, но и не могут быть показаны/удалены/прилеплены в другой список никакими ихними средствамиYury писал(а):ясно.. название промежуточной таблицы сбило с толкуStanislav писал(а):Нет, я же написал как у меня

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

