0

私は2つのテーブルを持っています:

+---------+-----------------+----------+----------+----------+---------+
| TrackId |       URI       | ArtistID |  Title   | AlbumID  | BitRate |
+---------+-----------------+----------+----------+----------+---------+
|  1      | /home/music/... |   234    | atune    |  8958223 |   192   |
|  2      | /music/uri1/... |   427    | goodsong |  222     |   192   |
|  3      | /music/uri2/... |   427    | goodsong |  222     |   128   |
|  4      | /music/uri3/... |   427    | goodsong |  222     |   160   |
|  5      | /home/music/... |   427    | goodsong |  333     |   128   |
|  6      | /home/music/... |   522    | another  |  3458859 |   128   |
+---------+-----------------+----------+----------+----------+---------+

+----------+------------+
| AlbumID  | AlbumTitle |
+----------+------------+
|  8958223 |   titleA   |
|  222     |   titleB   |
|  333     |   titleC   |
|  3458859 |   titleD   |
+----------+------------+

簡単に言えば、私が欲しいのはこれです:

+---------+-----------------+----------+----------+----------+------------+---------+
| TrackId |       URI       | ArtistID |  Title   | AlbumId  | AlbumTitle | BitRate |
+---------+-----------------+----------+----------+----------+------------+---------+
|  3      | /music/uri2/... |   427    | goodsong |  222     |   titleB   |   128   |
|  4      | /music/uri3/... |   427    | goodsong |  222     |   titleB   |   160   |
+---------+-----------------+----------+----------+----------+------------+---------+

これは、次のような重複を削除する試みです。

  • 同じタイトル
  • 同じアーティストID
  • 別のトラックID
  • 非最高ビットレートの重複
  • アルバムテーブルの同じアルバム名

重複するビットレートが最も高いエントリを返さない間

私はここで非常によく似た質問をしました:単一の行から重複を選択しますか?

その解決策は次のとおりです。

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)

...しかし、今回は別のテーブルを扱うことに頭を悩ませているようには見えません。

4

2 に答える 2

0

最初のテーブルにAlbumIdへのFK参照があるため、2番目のテーブルはユースケースには関係ありません。

select t.*, a.AlbumTitle
from Track t
inner join (
    select max(BitRate) as BitRate, ArtistId, Title, AlbumId
    from Track
    group by ArtistId, Title, AlbumId ) b
  on t.ArtistId = b.ArtistId and t.Title = b.Title and t.AlbumId = b.AlbumId and t.BitRate < b.BitRate
inner join Album a
      on t.AlbumId = a.AlbumId
于 2013-01-26T21:42:47.467 に答える
0

これを試してみてください:

SELECT c1.*
FROM CoreTracks c1
LEFT JOIN 
     (SELECT Title, ArtistID, AlbumID, MAX(BitRate) maxBitRate
      FROM CoreTracks
      GROUP BY Title, ArtistID, AlbumID) c2
    ON c1.Title = c2.Title
    AND c1.ArtistID = c2.ArtistID
    AND c1.AlbumID = c2.AlbumID
    AND c1.BitRate = c2.maxBitRate
WHERE c2.Title IS NULL

これがSQLフィドルです。

- 編集

アルバムタイトルを追加するには:

SELECT c1.*, a.AlbumTitle
FROM CoreTracks c1 
JOIN Albums a on c1.AlbumId = a.AlbumId
LEFT JOIN 
     (SELECT c.Title, c.ArtistID, c.AlbumID, MAX(c.BitRate) maxBitRate
      FROM CoreTracks c JOIN Albums A ON c.AlbumId = a.AlbumId
      GROUP BY Title, ArtistID, AlbumID) c2
    ON c1.Title = c2.Title
    AND c1.ArtistID = c2.ArtistID
    AND c1.AlbumID = c2.AlbumID
    AND c1.BitRate = c2.maxBitRate
WHERE c2.Title IS NULL

そして、更新されたフィドル

幸運を。

于 2013-01-26T21:47:29.263 に答える