## Removing bad data This is by no means recommended.. But during testing I somehow scrobbled movies. SET FOREIGN_KEY_CHECKS=0; DELETE FROM artists WHERE `name` = "%!s()"; DELETE FROM albums WHERE `name` = "%!s()"; DELETE album_artist FROM album_artist LEFT JOIN artists ON artists.uuid = album_artist.artist WHERE artists.uuid is null; DELETE album_artist FROM album_artist LEFT JOIN albums ON albums.uuid = album_artist.album WHERE albums.uuid is null; DELETE track_artist FROM track_artist LEFT JOIN artists ON artists.uuid = track_artist.artist WHERE artists.uuid is null; DELETE tracks FROM tracks LEFT JOIN track_artist ON track_artist.track = tracks.uuid WHERE track_artist.track IS NULL; DELETE scrobbles FROM scrobbles LEFT JOIN tracks ON tracks.uuid = scrobbles.track WHERE tracks.uuid is null; SET FOREIGN_KEY_CHECKS=1; Removing duplicates (based on same song played in same hour) -- backup stuff first DROP TABLE BACKUP_scrobbles; CREATE TABLE BACKUP_scrobbles (primary key (uuid)) as select * from scrobbles; SELECT BIN_TO_UUID(`user`, true), scrobbles.*, count(*) FROM scrobbles -- WHERE `user`= UUID_TO_BIN('', true) GROUP BY track, HOUR(created_at) HAVING count(*) > 1 ORDER BY COUNT(*) DESC; -- will only delete one set of dupes at a time, run until 0 updated rows DELETE scrobbles FROM scrobbles WHERE uuid IN ( SELECT uuid FROM ( SELECT `uuid` FROM scrobbles WHERE `user`= UUID_TO_BIN('', true) GROUP BY track, HOUR(created_at) HAVING count(*) > 1 ) x );