Удаление дублей. Где ошибка?

Тема в разделе "PHP", создана пользователем LEXAlForpostl, 24 окт 2009.

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

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    739
    Симпатии:
    226
    Здравствуйте.
    Написал скриптик, который из таблицы удаляет дубли.
    PHP:
    <?

    $db mysql_connect("localhost""root","") or die ("Ошибка соединения");
    mysql_select_db("db"$db)or die ("Ошибка соединения с бд ");
    $result mysql_query("SELECT id, text FROM table");
    while (
    $row mysql_fetch_array($resultMYSQL_BOTH)) {
        
    $sql="DELETE FROM `table` WHERE `id` <> '".$row["id"]."' AND `url`='".$row["text"]."'";
        echo 
    $sql."<br>";
        
    $result2 mysql_query($sql) or die (mysql_error());
    }

    ?>
    Скрипт, почему-то удаляёт всё.
    Пробовал
    PHP:
      $sql="DELETE FROM `table` WHERE `id` != '".$row["id"]."' AND `url`='".$row["text"]."'";
    Не помогает, также удаляет всё.

    Да, и ещё.
    Если вставляю отдельно sql запрос в РНРМуАдмине, то удаляются только дубли.
    А через скрипт удаляется всё.
     
  2. NoX

    NoX Писатель

    Регистр.:
    18 ноя 2007
    Сообщения:
    4
    Симпатии:
    1
    В SELECT-запросе добавь условие GROUP_BY(`text`)
    т.е. запрос должен быть типа
    Код:
    $result = mysql_query("SELECT id, text FROM table GROUP_BY(`text`)");
    
    а дальше всё как ты делал ;)
     
    LEXAlForpostl нравится это.
  3. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    739
    Симпатии:
    226
    Ещё вопрос.
    Как сделать чтобы запись в бд добавлялась, если она уникальна по полю text.
    В свойствах поля поставил uniq, но при добавлении такой же записи выдаёт ошибку.
    Можно сделать так чтобы не выдавало ошибку и скрипт дальше работал.
    Или как по-другому можно реализовать не добавления уже имеющейся записи по полю text?
     
  4. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    для игнорирования ошибок есть параметр IGNORE:
    INSERT IGNORE INTO ... VALUES ...

    Перейти по ссылке

    или может подойдёт ON DUPLICATE KEY UPDATE, тогда если при добавлении найдутся дубликаты то только обновить

    Перейти по ссылке


    ещё дубликаты можно удалять одним запросом
    Код:
    DELETE dup_row.*
    FROM table AS dup_row
    INNER JOIN (
    
        SELECT id, text, MIN(id) AS min_id
        FROM table
        GROUP BY text
        HAVING COUNT(*) > 1
    
    ) AS good_row
    ON good_row.text = dup_row.text
    AND good_row.text = dup_row.url
    AND good_row.min_id <> dup_row.id
    
     
    LEXAlForpostl нравится это.
  5. Kloster

    Kloster

    Регистр.:
    22 июн 2009
    Сообщения:
    216
    Симпатии:
    12
    Если же хочешь, чтобы при отсутствии записи она добавлялась, а при наличии в базе - обновлялась новыми данными, можно использовать replace, указывая значение уникального поля.
     
Статус темы:
Закрыта.