I have a table that is supposed to keep a trace of visitors to a given profile (user id to user id pair). It turns out my SQL query was a bit off and is producing multiple pairs instead of single ones as intended. With hindsight I should have enforced a unique constraint on each id+id pair.
Now, how could I go about cleaning up the table? What I want to do is delete all duplicate pairs and leave just one.
So for example change this:
23515 -> 52525 date_visited 23515 -> 52525 date_visited 23515 -> 52525 date_visited 12345 -> 54321 date_visited 12345 -> 54321 date_visited 12345 -> 54321 date_visited 12345 -> 54321 date_visited 23515 -> 52525 date_visited ...
Into this:
23515 -> 52525 date_visited 12345 -> 54321 date_visited
Update: Here is the table structure as requested:
id int(10) UNSIGNED Non Aucun AUTO_INCREMENT profile_id int(10) UNSIGNED Non 0 visitor_id int(10) UNSIGNED Non 0 date_visited timestamp Non CURRENT_TIMESTAMP
Use the INSERT IGNORE command rather than the INSERT command. If a record doesn't duplicate an existing record, then MySQL inserts it as usual. If the record is a duplicate, then the IGNORE keyword tells MySQL to discard it silently without generating an error.
ANSI SQL Solution
Use group by in a subquery:
delete from my_tab where id not in (select min(id) from my_tab group by profile_id, visitor_id);
You need some kind of unique identifier(here, I'm using id).
MySQL Solution
As pointed out by @JamesPoulson, this causes a syntax error in MySQL; the correct solution is (as shown in James' answer):
delete from `my_tab` where id not in ( SELECT * FROM (select min(id) from `my_tab` group by profile_id, visitor_id) AS temp_tab );
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With