Пометить дубли в MySql таблице

Тема в разделе "Базы данных", создана пользователем Lexx59, 30 мар 2011.

Модераторы: latteo
  1. Lexx59

    Lexx59

    Регистр.:
    9 янв 2009
    Сообщения:
    179
    Симпатии:
    38
    Помогите решить.
    Есть mysql табличка на 2353 элементов.
    В табличке помимо прочих есть поля: "URL" и "isdubl"
    У некоторых записей URL совпадают.
    Для всех записей где URL не уникальный надо присвоить "isdubl=`1`"
     
  2. citrus

    citrus Постоялец

    Регистр.:
    5 ноя 2006
    Сообщения:
    58
    Симпатии:
    8
    SELECT `URL`
    FROM `table`
    GROUP BY `URL`
    HAVING ( COUNT(`URL`) > 1 )

    выдаст все дубли URL.
     
  3. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.036
    Симпатии:
    699
    PHP:
    <?php
    //Данные для подключения к БД
    $host="localhost";                // Имя хоста
    $bdname="baza";                // Имя БД
    $bdlogin="baza";                // Логин к БД
    $bdpassword="parol";        // Пароль к БД

    $db=@mysql_connect($host,$bdlogin,$bdpassword);
    if(!
    $db)die(mysql_error());
    if(!@
    mysql_select_db($bdname,$db))die(mysql_error()); 
    $query_dubl=mysql_query("SELECT * FROM tablica ",$db);
    while(
    $urls=mysql_fetch_array($query_dubl)){
    $query_dubl2=mysql_query("SELECT * FROM tablica WHERE URL = '".$urls['URL']."'" ,$db);
    if(
    mysql_num_rows($query_dubl2)==1)
    {echo 
    "совпадений нет <br> ";
    }else {
    $update=mysql_query("UPDATE tablica SET isdubl='1' where URL = '".$urls['URL']."'",$db);}
    }
    ?>
     
    Lexx59 нравится это.
  4. Lexx59

    Lexx59

    Регистр.:
    9 янв 2009
    Сообщения:
    179
    Симпатии:
    38
    Такой селект выберет из нескольких одинаковых записей один id как уникальный, правильно? А надо пометить все дубли, чтобы потом выбрать из них наилучшую запись.

    Да. Вот это главное препятствие. Никак не могу понять эту парадигму.
    Вроде все просто - выбрать неуникальные и обновить поле.
    Код:
    UPDATE `isdubl`=1 from `table` where
    (
    SELECT `URL`
    FROM `table`
    GROUP BY `URL`
    HAVING ( COUNT(`URL`) > 1 )
    )
    
    Тут получается нужно вначале сделать select, а потом в цикле выбирать по одному URL и апдейтить.
    Хотя лучше ч\з дополнительную табличку сделать.

    Как вначале все URL этого запроса внести во вспомогательную table2
    Код:
    SELECT `URL`
    FROM `table1`
    GROUP BY `URL`
    HAVING ( COUNT(`URL`) > 1 )
    
    А потом проапдейтить
    Код:
    UPDATE `table1` SET `is_dubl` = 1 WHERE URL IN 'Все значения URL из table2'
    
    ?
     
  5. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    Все делается одним запросом:
    Код:
    UPDATE `test` SET `is_dubl` = 1 WHERE `url` IN(SELECT `url` FROM (SELECT * FROM `test` GROUP BY `url` HAVING (COUNT(`url`) > 1)) AS `temp`)  
    
     
    Lexx59 нравится это.
  6. citrus

    citrus Постоялец

    Регистр.:
    5 ноя 2006
    Сообщения:
    58
    Симпатии:
    8
    можно не делать select * , так как работаем только по одному полю:
    UPDATE `test` SET `is_dubl` = 1 WHERE `url` IN(SELECT `url` FROM (SELECT `url` FROM `test` GROUP BY `url` HAVING (COUNT(`url`) > 1)) AS `temp`)
     
  7. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    а можно написать хранимую процедуру, это уже вопрос оптимизации и в рамках поставленной ТС задачи роли не играет.
     
  8. Lexx59

    Lexx59

    Регистр.:
    9 янв 2009
    Сообщения:
    179
    Симпатии:
    38
    То что надо. Так и знал что есть красивое и элегантное решение в одну строчку.
     
  9. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Хочу удалить дубли в таблице, но не выходит выполнить запрос.

    `item` - таблица
    `id` - уникальный идентификатор записи в пределах таблицы
    `h_all` - md5 хеш по которому проводиться поиск дублей


    PHP:
    DELETE FROM `itemWHERE `idNOT IN(SELECT MIN(`id`) FROM `itemGROUP BY `h_all`)
    Выдает:
    1093:You can't specify target table 'item' for update in FROM clause


    Подскажите что не так.
     
  10. Rheola

    Rheola Создатель

    Регистр.:
    12 фев 2009
    Сообщения:
    19
    Симпатии:
    5
    Это не баг, а блокировка целостности.
    Читайте документацию. Надо 2 запроса. Первым - создаем табличку с теми Id, которые надо удалить. Вторым - удаляем. Как бы вам не хотелось одним запросом удалить - не получится.