как убрать из базы повторяющися имена

Тема в разделе "Базы данных", создана пользователем red_heads, 17 янв 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. red_heads

    red_heads

    Регистр.:
    30 янв 2007
    Сообщения:
    159
    Симпатии:
    26
    В базе встречаются повторяющиеся имена
    т.е.
    GSM антенна Adactus ADA-0056
    GSM антенна Adactus ADA-0056

    при этом у какой то записи есть описание и картинка у другой пустые значения, либо у обоих записей нету ни описания ни картинки (т.к. для этого товара не готова описания)
    как мне удалить из базы все повторяющиеся значения при этом оставив если есть, те у которых описания и картинка, либо просто оставив ту запись у которой идентификатор старше, если вообще нет описания у товара
     
  2. Karlasan

    Karlasan Постоялец

    Регистр.:
    7 дек 2007
    Сообщения:
    131
    Симпатии:
    205
    два варианта:
    1) не чистить базу. для вывода НЕповторяющихся использовать запрос вида

    Код:
    select [B]distinct[/B] name, kartinka, opisalovo from tovari where opisalovo<>'' and kartinka<>''
    ключевое слово distinct позволяет выбрать из базы уникальные (неповторяющиеся) значения.

    2) результаты запроса из пункта 1 сохранить в таблицу tmp_table, грохнуть оригинальную таблицу, затем переименовать tmp_table в первоначальное имя. Можно поместить в крон и выполнять сию операцию 1-2 раза в неделю.
     
  3. red_heads

    red_heads

    Регистр.:
    30 янв 2007
    Сообщения:
    159
    Симпатии:
    26
    ну так у меня описание есть не во всех дублированных товарах
    а этот запрос уберает если есть в одном из дубликатов описание , так?
    Код:
    select distinct name, kartinka, opisalovo from tovari where opisalovo<>'' and kartinka<>''
    есть товары без описания дублированные , с ними что делать?

    т.е.
    товар 1
    GSM антенна Adactus ADA-0059 описания
    GSM антенна Adactus ADA-0059 нет описания

    товар 2
    GSM антенна Adactus ADA-0056 нет описания
    GSM антенна Adactus ADA-0056 нет описания
     
  4. pk2002

    pk2002

    Регистр.:
    14 ноя 2006
    Сообщения:
    382
    Симпатии:
    350
    Этот запрос уберет повторяющиеся записи (у которых повторяются все поля)
     
  5. aabramov

    aabramov Создатель

    Регистр.:
    18 янв 2008
    Сообщения:
    16
    Симпатии:
    1
    Distinct уберет только записи, повторяющиеся по всем полям, при этом те, у которых описалова нет вообще не попадут (обрезаны условием where)
    Для Вашего случая можно попытаться сделать так:
    Код:
     
    select * from tovari group by name
    
    (это некорректно с точки зрения SQL, но в мускуле работает)
    Так можно выбрать именно "старшие" записи.
     
  6. modesco

    modesco Создатель

    Регистр.:
    4 июн 2007
    Сообщения:
    38
    Симпатии:
    1
    примерно так:
    delete t2.* from table t1, table t2 where t1.descr = t2.descr AND (t1.descr <> '' AND t2.descr = '') OR (t1.descr = t2.descr AND t1.descr = '' AND t2.id>t1.id)
     
  7. Fally

    Fally Прохожие

    по столбцу с названием сделай UNIQUE-индекс и всё будет нормально, а при вставке данных используй INSERT INTO ... ON DUPLICATE UPDATE ... и будет счастье)..
    Кстати, DISTINCT работает медленней чем GROUP BY `col_name`
     
  8. IntenT

    IntenT Создатель

    Регистр.:
    28 янв 2008
    Сообщения:
    40
    Симпатии:
    5
    Версия сервера какая?
    если 5.х - попробуй
    create table blabla as select ...
     
  9. x-free

    x-free Писатель

    Регистр.:
    11 мар 2009
    Сообщения:
    6
    Симпатии:
    0
    можно использовать конструкцию типа

    insert into table_name2
    select *
    from table_name1
    group by "список полей по которым повторения"

    у table_name2 такая же структура что и у table_name1
     
  10. baltazor-vova

    baltazor-vova Постоялец

    Регистр.:
    4 авг 2009
    Сообщения:
    80
    Симпатии:
    18
    А можно пожалуйста более подробней как для самого самого новичка что куда вставлять, как зделать такую вещь? Просто имею дело з базой где товара свыше 6000! Помогите плиз заранее благодарен!
     
Статус темы:
Закрыта.