Удалите повторяющиеся строки, но сохраните одну.

  • Автор темы PP1
  • 39
  • Обновлено
  • 17, May 2024
  • #1
Привет, Я хочу удалить только повторяющиеся записи, принадлежащие офису.

Должен оставаться одним из величайших ID. Повторные телефоны с разными оффицеидами должны остаться.

Телефонный столик:

идентификатор офисаИдентификатор телефона

-----------------------

1 10 111

2 11 222

3 11 222

4 12 111

5 13 444

6 14 555

7 14 555

Ниже приведен запрос, который удаляет все повторяющиеся телефоны без соблюдения условия offiseId.

 
delete phones

from phones

inner join (

select max(id) as lastId, phone

from phones

group by phone

having count(*) > 1) duplic on duplic.phone = phones.phone

where phones.id < duplic.lastId
;
Код (разметка): Например, после выполнения запроса в таблице должны быть удалены записи с идентификаторами 2 и 6, телефоны 222 и 555. Однако должны остаться телефоны с идентификаторами 1 и 4 с телефонами 111 и 111, поскольку у них разные офисные идентификаторы.

. Буду признателен, если кто-нибудь поможет. Спасибо.

PP1


Рег
25 Dec, 2014

Тем
1

Постов
2

Баллов
12
  • 19, May 2024
  • #2
Вы понимаете, что уникальные ключи не ограничиваются одним полем
 
ALTER IGNORE TABLE `phones`

ADD UNIQUE INDEX `uniquephones` (`phones`, `office`);
Код (разметка):
 

PvSh007


Рег
19 Dec, 2012

Тем
1

Постов
5

Баллов
15
  • 03, Jun 2024
  • #3
Вероятно, вам понадобится использовать вложенный запрос, чтобы определить самый высокий идентификатор и удалить те, которые не являются самыми высокими. Просто концептуально, из головы: УДАЛИТЬ ИЗ телефонов ГДЕ НЕТ id( ВЫБЕРИТЕ идентификатор ИЗ телефонов ГРУППИРОВАТЬ ПО идентификатору офиса СОРТИРОВАТЬ ПО id DESC ) Я предпочитаю не использовать count(*) или внутреннее соединение, потому что мне нужно только определить максимальный идентификатор для каждого OfficeId, а все остальное я могу отбросить. Обязательно сделайте резервную копию и протестируйте ее перед фиксацией, поскольку это необратимо и может привести к удалению большого количества данных из таблицы.
 

Mineban


Рег
05 Feb, 2015

Тем
1

Постов
3

Баллов
13
  • 07, Jun 2024
  • #4
Черт возьми, ты прав.

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

По сути, вы захотите соединить таблицу сама с собой вместо выполнения вложенного запроса.

http://stackoverflow.com/questions/3346068/delete-statement-in-a-same-table
 

postroy-hram


Рег
30 Nov, 2013

Тем
1

Постов
2

Баллов
12
Тем
49554
Комментарии
57426
Опыт
552966

Интересно