SQL - 返回具有重复值的行,其中每个组中的一行具有某个属性而不是另一个

时间:2018-04-01 17:14:39

标签: sql sqlite

我最好是SQL新手 - 感谢您对此答案的任何帮助。它是MediaMonkey程序特有的,但更广泛适用我认为因为MediaMonkey的数据库我相信SQLite 3.我查询的表格叫做歌曲和所有栏目我都是引用在此表中。

我使用MediaMonkey中的Custom4字段存储Musicbrainz中的歌曲工作ID,以及Custom5字段来存储AcoustID。我试图创建一个歌曲封面/替代/现场版本的播放列表,我评了5星,但这首5首歌不是经典作品或爵士乐录音(我使用分组字段) (GroupDesc)表示曲目是古典曲目还是爵士曲目。

SQL查询的参数必须是这样的:

  • 与5星级录音相同的工作ID(等级= 100),其中分组 五星级录音不是古典音乐。或者'爵士' (我很好 五星级流行作品的经典或爵士乐封面)
  • 来自任何5星级录音的不同AcoustID(消除重复 录制)
  • 评级< 5星(我不想包括5首星级歌曲 本身)

我从我发现的一些例子中拼凑了以下SQL查询:

Songs.Custom4 IN (SELECT Custom4 FROM Songs GROUP BY Custom4 HAVING Count(*) > 1 AND Max(Rating) > 99 AND Custom4 <> '' AND GroupDesc <> 'Classical' AND GroupDesc <> 'Jazz')

这似乎包括以下内容:

  • 与5星录音相同的WorkID
  • 古典音乐或爵士乐曲目仅限于古典音乐或爵士曲目的评分 5星,还有另一个具有相同工作ID的轨道 古典音乐或爵士音乐,或者古典音乐或爵士音乐都有相同之处 工作ID作为非经典或爵士乐的五星级录音
  • 包括5星级录音的重复,包括5星 录音本身

不知何故,我需要过滤出5星经典曲目或爵士曲目以及与这些曲目具有相同工作ID的曲目,我需要排除重复和5星级录音。

我们假设你有一张这样的表:

&#13;
&#13;
<table class="blueTable">
<thead>
<tr>
<th>&nbsp;Song</th>
<th>Grouping</th>
<th>Rating</th>
<th>Work ID</th>
<th>AcoustID</th>
</tr>
</thead>
<tbody>
<tr>
<td>A1</td>
<td>Classical&nbsp;</td>
<td>100&nbsp;</td>
<td>a12&nbsp;</td>
<td>b12&nbsp;</td>
</tr>
<tr>
<td>A2</td>
<td>Jazz&nbsp;</td>
<td>100&nbsp;</td>
<td>a21&nbsp;</td>
<td>b21&nbsp;</td>
</tr>
<tr>
<td>A3</td>
<td>&nbsp;NULL</td>
<td>100&nbsp;</td>
<td>a31&nbsp;</td>
<td>b31&nbsp;</td>
</tr>
<tr>
<td>A4</td>
<td>NULL&nbsp;</td>
<td>NULL&nbsp;</td>
<td>a12&nbsp;</td>
<td>b41&nbsp;</td>
</tr>
<tr>
<td>A5</td>
<td>NULL&nbsp;</td>
<td>NULL&nbsp;</td>
<td>a31&nbsp;</td>
<td>b31&nbsp;</td>
</tr>
<tr>
<td>A6</td>
<td>Classical&nbsp;</td>
<td>NULL&nbsp;</td>
<td>a31&nbsp;</td>
<td>b61&nbsp;</td>
</tr>
<tr>
<td>A7</td>
<td>NULL&nbsp;</td>
<td>NULL&nbsp;</td>
<td>a31&nbsp;</td>
<td>b71&nbsp;</td>
</tr>
</tbody>
</table>
&#13;
&#13;
&#13;

我希望我的查询包含以下歌曲:A6,A7

以下是逻辑:A1和A2将被排除,因为它们是古典音乐和爵士乐曲目,并且不是评级为100的流行歌曲的封面。由于它的评级为100,因此将排除A3。 A4将被排除在外,因为它是被评为100的经典曲目的流行封面.AV将被排除,因为它是A3的副本。包含A6 - 它是A3的经典封面。包含A7 - 它是A3的封面。

0 个答案:

没有答案