2017-02-11 11 views
1

У меня есть следующая база данных и вы хотите удалить красные, потому что они удвоены. Поэтому я должен проверять каждую строку, если другая строка соответствует pid, price, price_old, link и shop.SQL: Удалить дублированные строки? (PHP)

Но как я могу проверить это и как его удалить?

enter image description here

Может быть, проще всего было бы генерировать идентификатор из значений внутри каждой строки. Поэтому, если значения внутри строки будут равны, id будет равен, и у кого есть только одно значение для сравнения с другими идентификаторами. Это лучший способ? - Если да, как я могу это сделать?

Поздравления!

ответ

1

ли тот факт, вы не имеете никакого способа для получения Тхи отчетливой строки можно добавить uniqie идентификатора с помощью

ALTER TABLE my_table 
ADD id int NOT NULL AUTO_INCREMENT 

После этого вы можете использовать не в том, где идентификатор не минимальный сгруппированный по значению нужно для определение дублирования

delete from my_table 
where id NOT in (select min(id) from my_table 
        group by shop, link 
       ) 
+0

У меня пока нет удостоверения личности ... Как я могу позволить мне сгенерировать идентификатор из значений - pid, price, price_old, link и shop? – Jan

+0

У меня есть обновление asnwer с генерацией id – scaisEdge

0

Самый простой способ запустить distinct запрос:

select distinct pid, price, price_old, link, shop 
from t; 

Вы можете создать новую таблицу, используя into. Это самый простой способ. Поскольку все столбцы одинаковы, MySQL не предлагает простой метод для удаления повторяющихся строк (оставив один из них).

Однако, возможно, что ваши текущие результаты генерируются запросом. Если это так, вы можете просто добавить select distinct в запрос. Однако было бы лучше исправить запрос, чтобы он не генерировал дубликаты. Если это так, то задайте еще один вопрос с образцами данных, желаемыми результатами (как текст, а не изображение) и запрос, который вы используете в настоящее время.

+0

Нет, это не результат запроса. У меня есть cronjob, который работает каждые 24 часа. Но моя проблема в том, что этот Cronjob добавит новые данные, а некоторые значения будут по-прежнему такими же, как и в cronjob, но некоторые значения будут отличаться, как и раньше в cronjob. Таким образом, мой единственный способ - удалить все повторяющиеся строки, оставив один из них. – Jan

+0

@Jan. , ,Вы должны исправить работу cron, чтобы не вставлять повторяющиеся значения. Кроме того, каждая строка должна (как минимум) иметь уникальный идентификатор (автоинкремент) и дату/время создания. –

0

Test это первое на тестовой таблице:

DELETE t1 
FROM t t1, t t2 
WHERE t1.id > t2.id AND t1.price = t2.price 
    AND t1.link = t2.link AND t1.shop = t2.shop 
    AND t1.price_old = t2.price_old; 

В основном вы удаляете один с наибольшим ID, если эти параметры равны

0
select * from 
(select pid, price, price_old, link , 
row_number() over(partition by pid, price, price_old, link, shop order by pid) as rank 
from my_table) temp 
where temp.rank = 1 

Этот запрос будет группировать по всем столбцам первым и оценивать их. Дублированные строки будут иметь ранг> 1. Неважно, что мы берем первую или вторую строку, так как оба являются копиями друг друга. Мы просто берем строки с рангом 1. Строки, которые не дублируются, также будут иметь ранг 1 и, следовательно, не будут игнорироваться.

Еще один способ этого - использовать союз.

select * from my_table UNION select * from my_table 

 Смежные вопросы

  • Нет связанных вопросов^_^