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

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

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

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Здравствуйте.
    Написал скриптик, который из таблицы удаляет дубли.
    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
    Сообщения:
    708
    Симпатии:
    225
    Ещё вопрос.
    Как сделать чтобы запись в бд добавлялась, если она уникальна по полю text.
    В свойствах поля поставил uniq, но при добавлении такой же записи выдаёт ошибку.
    Можно сделать так чтобы не выдавало ошибку и скрипт дальше работал.
    Или как по-другому можно реализовать не добавления уже имеющейся записи по полю text?
     
  4. polyetilen

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

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

    http://dev.mysql.com/doc/refman/5.1/en/insert.html

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

    http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html


    ещё дубликаты можно удалять одним запросом
    Код:
    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, указывая значение уникального поля.
     
Статус темы:
Закрыта.