Mysql 是否从一行中选择重复项?
这里有一个名为CoreTracks的表:Mysql 是否从一行中选择重复项?,mysql,sqlite,Mysql,Sqlite,这里有一个名为CoreTracks的表: +---------+-----------------+----------+----------+----------+---------+ | TrackId | URI | ArtistID | Title | FileSize | BitRate | +---------+-----------------+----------+----------+----------+---------+ | 1
+---------+-----------------+----------+----------+----------+---------+
| 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 |
+---------+-----------------+----------+----------+----------+---------+
我正在尝试删除重复项,因为它们具有相同的标题、相同的艺术家id和不同的曲目id,同时不返回具有最高比特率和最高文件大小的条目
到目前为止,我得到的是:
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);
它返回每一个音轨。要使此查询正常工作,我缺少什么?从group by Title、ArtistID sort by BitRate asc中选择max(trackId)-然后将其包装到另一个Select by trackId中
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);
尚未测试,但应能正常工作。这将得到相反的结果(即跳过重复项): 以及副本:
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)
尝试自连接而不是普通查询。
我没有试过。这看起来不错。但是,我使用的是sqlite(我是新手),它返回了一个错误:“SQL错误:滥用聚合函数max()”。此外,如果您想永久删除,可以将SELECT替换为delete。返回的错误是:“错误:在创建之前需要GROUP BY子句”。所以我把“groupbya.URI”放在HAVING子句前面,并没有返回任何数据。也许sql light在这方面有所不同。这太不可思议了。多谢各位!与其选择重复的结果,我该如何删除它们?@BrandonMinton您可以执行“从TrackId所在的CoreTracks中删除”(选择c1.TrackId FROM…),这非常有效,而且速度很快!@Glenn您让学习变得很有趣。再次感谢您。