Данные таблицы следующие
select * from user where username in (select username from user group by username HAVING count(*) >1);
select * from user where (username,phone)
in (select username,phone from user group by username,phone HAVING count(*) >1);
Уведомление:whereВ условиях(username,телефон) нельзя опустить, иначе будет сообщено об ошибке.
DELETE from user where (username,phone) -- Уведомление: Здесь необходимо добавить круглые скобки и рассматривать их как совместное поле.
IN (
-- Найдите информацию о пользователе с повторяющимися именами пользователей и номерами мобильных телефонов.
SELECT username,phone FROM user GROUP BY username,phone HAVING COUNT(1) > 1
) AND id NOT IN (
-- Запросить запись с наименьшим идентификатором
SELECT MIN(id) FROM user GROUP BY username,phone HAVING COUNT(1) > 1
);
Кажется, что приведенный выше оператор должен выполняться нормально. Он удалит повторяющиеся записи с одинаковым именем пользователя и номером мобильного телефона и сохранит только запись с наименьшим идентификатором. Фактическое выполнение сообщит о следующей ошибке:
1093 - Вы не можете указать целевую таблицу «пользователь» для обновления в предложении FROM. Значение: данные, запрошенные в той же таблице, не могут использоваться в качестве обновленных данных в той же таблице.
Правильный способ написания такой:
DELETE from user where id in(
select * from (
select id from user where (username,phone) -- Уведомление: Здесь необходимо добавить круглые скобки и рассматривать их как совместное поле.
IN (
-- Найдите информацию о пользователе с повторяющимися именами пользователей и номерами мобильных телефонов.
SELECT username,phone FROM user GROUP BY username,phone HAVING COUNT(1) > 1
) AND id NOT IN (
-- Запросить запись с наименьшим идентификатором
SELECT MIN(id) FROM user GROUP BY username,phone HAVING COUNT(1) > 1
)
)as u
);
Выберите результат через промежуточную таблицу еще раз, избежав таким образом ошибок.
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT 'имя пользователя',
`phone` varchar(20) DEFAULT NULL COMMENT «Зарегистрировать номер мобильного телефона»,
`age` int(11) DEFAULT NULL COMMENT 'возраст',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='Таблица пользователей';
INSERT INTO `user`(`id`, `username`, `phone`, `age`) VALUES (1, 'Я zjq основной базы данных', '13666666666', 18);
INSERT INTO `user`(`id`, `username`, `phone`, `age`) VALUES (2, 'zjq', '15656455662', 18);
INSERT INTO `user`(`id`, `username`, `phone`, `age`) VALUES (3, 'zjq666', '15656455663', 18);
INSERT INTO `user`(`id`, `username`, `phone`, `age`) VALUES (4, 'zjq', '15656455664', 18);
INSERT INTO `user`(`id`, `username`, `phone`, `age`) VALUES (5, 'zjq666', '15656455662', 18);
INSERT INTO `user`(`id`, `username`, `phone`, `age`) VALUES (6, 'zjq', '15656455666', 18);
INSERT INTO `user`(`id`, `username`, `phone`, `age`) VALUES (7, 'zjq888', '15656455667', 18);
INSERT INTO `user`(`id`, `username`, `phone`, `age`) VALUES (8, 'zjq', '15656455668', 18);
INSERT INTO `user`(`id`, `username`, `phone`, `age`) VALUES (9, 'zjq323', '15658855662', 18);
INSERT INTO `user`(`id`, `username`, `phone`, `age`) VALUES (10, 'zjq', '15656455662', 18);
INSERT INTO `user`(`id`, `username`, `phone`, `age`) VALUES (11, 'zjq', '16666666662', 99);
Woo la la la la Если вам понравилось, поставьте лайк, сохраните или подпишитесь.