База данных удаляет строки с одинаковым значением - PullRequest
2 голосов
/ 03 декабря 2011

Дубликат Как удалить дубликаты записей в базе данных mysql?

   id  |  name   |      link
    1     bla     www.google.com
    2     lal     www.stackoverflow.com
    3     afs     www.google.com
    4     sds     www.microsoft.com

В моей базе данных есть несколько строк с одинаковыми ссылками,Я хочу удалить одну из этих строк с той же ссылкой.

Например, в моем примере я хочу удалить строку с id = 3, но хочу сохранить id = 1.

Как я могу это сделать?

кстати 5840 строк.и я не знаю, какие из них одинаковы.Мне нужен код, чтобы сравнить их

Ответы [ 6 ]

3 голосов
/ 03 декабря 2011

Хитрость в том, чтобы сохранить последнее значение при сравнении идентификаторов

DELETE FROM table_name t1, table_name t2 WHERE t1.name = t2.name and t1.link = t2.link and t1.id < t2.id

Это просто идея, это полнофункциональный пример в моей среде оракула (я не использую БД несколько недель, поэтому япытаюсь минимизировать запрос прямо сейчас, извините)

SQL> select * from dup;

    ID    STH       STH2
---------- ---------- ----------
     1     45         45
     2     45         56
     3     45         45
     4     14         56
     5     14         56


DELETE FROM dup where id in (SELECT DISTINCT t1.id FROM dup t1, dup t2 WHERE t1.sth = t2.sth and t1.sth2 = t2.sth2 and t1.id < t2.id);

SQL> select * from dup;

    ID    STH       STH2
---------- ---------- ----------
     2     45         56
     3     45         45
     5     14         56
0 голосов
/ 03 декабря 2011

Хорошо. Я настроил это как отдельный ответ и удалил другой.

Сначала выберите все отличительные ссылки в таблице

SELECT DISTINCT( link ) FROM table

Затем, используя PHP, выполните циклнад каждой возвращенной строкой и примените приведенный ниже SQL к ссылкам, которые были удалены.

DELETE FROM table
WHERE id IN (
   //Selects Ids whose value is more than the 1st occurence
   SELECT id 
   FROM table 
   WHERE 
             link = 'CURRENT_LINK' 
         AND id > ( // Check this isn't the first occurence
                      SELECT MIN( id ) 
                      FROM table
                      WHERE link = 'CURRENT_LINK'
                  )
)
0 голосов
/ 03 декабря 2011

Не проверено, но я думаю, что это сработает

<code>
$query="SELECT * FROM tablename"; 
$result=mysql_query($query);</p>

<p>while($row = mysql_fetch_array($result)
{
   $query1="SELECT * FROM tablename WHERE link = '".$row[2]."'"; 
   $result1=mysql_query($query1);
   $count = mysql_num_rows($result1);
   mysql_query("DELETE FROM tablename WHERE link='".$row[2]."' LIMIT 1,$count");
   echo "deleted $row[1] <br>";
}
0 голосов
/ 03 декабря 2011

Если вы знаете URL, но не идентификатор, но знаете, что хотите удалить только один, вы можете использовать ограничение.

DELETE FROM `table` WHERE `link` = 'www.google.com' LIMIT 1

Или, если вы знаете имя и ссылку, используйте их вместе.

DELETE FROM `table` WHERE `name` = 'afs' AND `link` = 'www.google.com'
0 голосов
/ 03 декабря 2011

Вы можете выбрать первый случай, например, google.com, затем получите идентификатор (например, first_ID) первой записи google.com и удалите все, что пришло после этого идентификатора

УДАЛИТЬ ИЗ таблицы, где id> first_ID И ссылка, например "www.google.com"

0 голосов
/ 03 декабря 2011

хорошо, для SQL вы должны будете указать, какой из них оставить, обычно. Рассмотрим пример для первого id. Тогда вы можете сделать

select min(id), link from TABLE group by link

и затем удалите все те, где link не соответствует минимальному идентификатору. Должен быть одним (хотя и вложенным) оператором SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...