Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача одним запросом, Перенос из таблицы лишних записей 
V
    Опции темы
CHERRY
Дата 24.2.2016, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



Предположим есть таблица:
Код

DROP TABLE IF EXISTS t;
CREATE TABLE t (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `a` varchar(3) ,
  `tel` varchar(12) ,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
insert into t values 
                              (1,  'a1', '111-11-11'), 
                              (2,  'a2', '222-22-22') ,
                              (3,  'a3', '111-11-11') ,
                              (4,  'a4', '333-33-33') ,
                              (5,  'a5', '333-33-33') ,
                              (6,  'a6', '111-11-11') ,
                              (7,  'a7', '222-22-22') ,
                              (8,  'a8', '333-33-33') ,
                              (9,  'a9', '444-44-44') ;


Необходимо убрать(перенести в другую таблицу) из таблицы t лишние записи в соответствии со следующими критериями:
1.В таблице разрешены записи с одним номером телефона, т.е. телефон встречается 1 раз.
С этим вроде понятно
Код

SELECT * FROM `t` GROUP BY tel 

 Осталось             (1,  'a1', '111-11-11')      уходят записи (3,  'a3', '111-11-11') 
                             (2,  'a2', '222-22-22')                              (5,  'a5', '333-33-33')
                             (4,  'a4', '333-33-33')                              (6,  'a6', '111-11-11')
                             (9,  'a9', '444-44-44')                              (7,  'a7', '222-22-22')
                                                                                            (8,  'a8', '333-33-33')
2.В таблице разрешены записи, где номер телефона повторяется не более 2-х раз
   Осталось           (1,  'a1', '111-11-11')      уходят записи (6,  'a6', '111-11-11')
                             (2,  'a2', '222-22-22')                              (8,  'a8', '333-33-33')
                             (3,  'a3', '111-11-11')                              (9,  'a9', '444-44-44')
                             (4,  'a4', '333-33-33')                               
                             (5,  'a5', '333-33-33') 
                             (7,  'a7', '222-22-22')

Ну и в общем случае, где номер телефона повторяется не более N раз.
Пытался реализовать следующим образом. Сначала выбираем уникальные
SELECT * FROM `t` GROUP BY tel  копируем их во временную таблицу и удаляем в основной. Затем опять выбираем уникальные и повторяем копирование и удаление.
Можно ли задачу оформить одним запросом? Спасибо.
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
ksnk
Дата 24.2.2016, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 2
Всего: 386



вот такое
Код

select * from t where id in(
select t1.id from t as t1 join t as t2 on t1.tel=t2.tel group by t1.tel having count(t1.id)=1
);

выдаст нам все строки с телефонами, которые встречаются в таблице только один раз. Соответственно `<=N` вместо `=1` выдаст те телефоны, которые попались не более N раз.

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
CHERRY
Дата 24.2.2016, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



Цитата

Код

select * from t where id in(
select t1.id from t as t1 join t as t2 on t1.tel=t2.tel group by t1.tel having count(t1.id)=1
);


Спасибо за участие. Это не совсем то. Возможно я не очень четко описал задачу. Но должно быть, как в приведенных выше примерах. Нужно как бы отфильтровать записи с "лишними" телефонами. Представьте, человек дает объявление в газету по телефону. Он диктует "кучу" объявлений на один номер. Нужно ограничить аппетит и оставить одно объявление на номер телефона (один телефон - одна запись в таблице). Или ограничить более лояльно. Оставить два объявления на один номер телефона (один номер телефона - две записи в таблице). И т.д.
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
Akina
Дата 24.2.2016, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(CHERRY @  24.2.2016,  14:17 Найти цитируемый пост)
Можно ли задачу оформить одним запросом? 

Один запрос == одно действие. Так что ОДНИМ запросом задача не решается по определению.
Как минимум два запроса - первый переносит записи во вторую таблицу, второй удаляет из первой таблицы.

Цитата(CHERRY @  24.2.2016,  15:18 Найти цитируемый пост)
Нужно как бы отфильтровать записи с "лишними" телефонами.

Для этого надо как минимум сформировать чёткий и однозначный критерий, позволяющий определить, что ИМЕННО ЭТУ запись следует оставить либо переместить. Например 
Цитата(CHERRY @  24.2.2016,  14:17 Найти цитируемый пост)
 Осталось             (1,  'a1', '111-11-11')      уходят записи (3,  'a3', '111-11-11') 

никак не говорит о том, почему именно так, а не наоборот.

Цитата(CHERRY @  24.2.2016,  15:18 Найти цитируемый пост)
Представьте, человек дает объявление в газету по телефону. Он диктует "кучу" объявлений на один номер. Нужно ограничить аппетит и оставить одно объявление на номер телефона (один телефон - одна запись в таблице). 

Это надо ограничивать ещё на стадии ввода - интерфейс ввода или оператор должны сообщать, что "указанный телефон уже использован в XX объявлениях, для его использования следует сначала аннулировать старые объявления". И соответственно запрещать ввод таких телефонов в БД (например, триггерной логикой).


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
CHERRY
Дата 24.2.2016, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



Позволю себе заметить, что ваш совет ничего не прояснил.
Цитата

Для этого надо как минимум сформировать чёткий и однозначный критерий, позволяющий определить, что ИМЕННО ЭТУ запись следует оставить либо переместить. 

Есть таблица в которой есть поле с повторяющимися в произвольном порядке и произвольном количестве значениями. Просьба состоит в том, что нужно составить запрос, который выберет все записи у которых в поле "tel" встречаются повторы не более N раз. В случае, когда N=1 это будет
Код

SELECT * FROM t GROUP BY tel

И не важно какие записи попадут в выборку. Важно ограничить число повторов по полю tel.
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
CHERRY
Дата 24.2.2016, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



Код

SELECT * FROM t t1 WHERE N>(SELECT count(*) FROM t t2 WHERE t1.tel =t2.tel and t2.id < t1.id ) ORDER BY id

где N=1..n
Запрос возвращает выборку с N ограничением на повторы.
Всем спасибо за участие.

Ищите и обрящете.
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1000 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.