2012-03-27 4 views
2

Здесь у меня есть таблица под названием CoreTracks:Выберите дубликаты из одной строки?

+---------+-----------------+----------+----------+----------+---------+ 
| TrackId |  URI  | ArtistID | Title | FileSize | BitRate | 
+---------+-----------------+----------+----------+----------+---------+ 
| 1  | /home/music/... | 234 | atune | 8958223 | 192 | 
| 2  | /home/music/... | 427 | goodsong | 6954373 | 192 | 
| 3  | /home/music/... | 427 | goodsong | 4695698 | 128 | 
| 4  | /home/music/... | 427 | goodsong | 5839962 | 160 | 
| 5  | /home/music/... | 427 | goodsong | 4695698 | 128 | 
| 6  | /home/music/... | 522 | another | 3458859 | 128 | 
+---------+-----------------+----------+----------+----------+---------+ 

То, что я хочу извлечь это:

+---------+-----------------+----------+----------+----------+---------+ 
| TrackId |  URI  | ArtistID | Title | FileSize | BitRate | 
+---------+-----------------+----------+----------+----------+---------+ 
| 3  | /home/music/... | 427 | goodsong | 4695698 | 128 | 
| 4  | /home/music/... | 427 | goodsong | 5839962 | 160 | 
| 5  | /home/music/... | 427 | goodsong | 4695698 | 128 | 
+---------+-----------------+----------+----------+----------+---------+ 

Я пытаюсь удалить дубликаты на основе имеющих одинаковую должность, тот же художник идентификатор и другой идентификатор дорожки, не возвращая запись с наивысшим битрейтом и самым высоким размером файла.

То, что я до сих пор это:

SELECT * FROM CoreTracks 
WHERE Title = Title AND ArtistID = ArtistID 
AND BitRate != (SELECT MAX(BitRate) FROM CoreTracks WHERE Title = Title AND ArtistID = ArtistID) 
AND FileSize != (SELECT MAX(FileSize) FROM CoreTracks WHERE Title = Title AND ArtistID = ArtistID); 

который возвращает каждый трек. Что мне не хватает, чтобы этот запрос работал?

ответ

2

Это получит обратное (т.е. пропускать дублированные):

SELECT c1.* 
    FROM CoreTracks c1 
     ,(SELECT Title, ArtistID, MAX(FileSize) AS maxFileSize, MAX(BitRate) maxBitRate 
      FROM CoreTracks 
      GROUP BY Title, ArtistID) c2 
    WHERE c1.Title = c2.Title 
    AND c1.ArtistID = c2.ArtistID 
    AND (c1.FileSize = c2.maxFileSize OR c1.BitRate = c2.maxBitRate) 

И дубликатами:

SELECT c1.* 
    FROM CoreTracks c1 
     ,(SELECT Title, ArtistID, MAX(FileSize) AS maxFileSize, MAX(BitRate) maxBitRate 
      FROM CoreTracks 
      GROUP BY Title, ArtistID) c2 
    WHERE c1.Title = c2.Title 
    AND c1.ArtistID = c2.ArtistID 
    AND (c1.FileSize != c2.maxFileSize AND c1.BitRate != c2.maxBitRate) 
+0

Это невероятно. Спасибо много! –

+0

вместо того, чтобы выбирать повторяющиеся результаты, как я могу их удалить? –

+1

@BrandonMinton Вы можете сделать «УДАЛИТЬ ОТ CoreTracks WHERE TrackId IN (SELECT c1.TrackId FROM ...) – Glenn

0

Выберите max (trackId) из группы по названию, по типу ArtistID по BitRate asc - затем оберните это в другое, выбрав trackId?

0
SELECT A.* FROM CoreTracks A, CoreTracks B 
WHERE A.Title = B.Title AND A.ArtistID = B.ArtistID AND A.trackId != B.trackId 
HAVING A.BitRate != MAX(A.BitRate) AND A.FileSize != MAX(A.FileSize); 

Еще не проверено, но должно работать.

+0

Это хорошо выглядит. Однако я использую sqlite (я новичок в нем), и он возвращает ошибку: «Ошибка SQL: неправильное использование агрегатной функции max()». –

+0

Попробуйте отредактировать версию с помощью HAVING: просто скопируйте и вставьте. – kasavbere

+0

Также, если вы хотите удалить навсегда, вы можете заменить SELECT на DELETE. – kasavbere

0

Попробуйте самостоятельно присоединиться вместо обычного запроса. Я не пробовал.

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