【发布时间】:2020-04-29 18:36:27
【问题描述】:
我有3张桌子:工作、录音、发布
1 个作品可以有多个录音,1 个录音只出现在 1 个版本中
表格:工作
+---------+-----------+
| work_id | name |
+---------+-----------+
| 1 | Hello |
| 3 | Luna |
| 4 | Feel good |
| 5 | My self |
+---------+-----------+
表格:录音
+---------------------------------------------------------------------+
| recording_id | work_id | release_id | name | is_art | is_vid |
+---------------------------------------------------------------------+
| 45 | 1 | 45 | Hello4 | 1 | 0 |
| 78 | 3 | 67 | Luna5 | 1 | 0 |
| 23 | 5 | 128 | My self (r) | 1 | 0 |
| 95 | 5 | 156 | My self II | 1 | 0 |
| 17 | 4 | 67 | Luna67 | 1 | 0 |
+---------------------------------------------------------------------+
表格:发布
+--------------------------------------------+
| release_id | name | year | month | day |
+--------------------------------------------+
| 45 | Yo | 1998 | 12 | NULL |
| 67 | Testing | 1967 | 3 | 3 |
| 128 | Maybe | 2018 | 10 | 21 |
| 156 | Again | 2018 | 10 | NULL |
+--------------------------------------------+
基本上,对于每个work,我想返回recording,其中is_art = 1 和is_vid = 0 AND 是release 是最旧的(最旧的年、月和日)。我可能是recording release 可以具有相同的year、month 和day。在那种情况下,我想我需要找到一个唯一标识符,所以我会选择最新的release_id
结果集应如下所示:
+---------+---------------------------------------+
| work_id | name | recording_id | name |
+---------+---------------------------------------+
| 1 | Hello | 45 | Hello4 |
| 3 | Luna | 78 | Luna5 |
| 4 | Feel good | 17 | Luna67 |
| 5 | My self | 23 | My self (r)|
+---------+---------------------------------------+
到目前为止,我创建了这个查询,但老实说,作为一个新手,我知道这一切都错了。它返回重复的行。我觉得我需要使用group by 和子查询,但是经过 2 天的搜索和测试,我无法创建解决方案……我快疯了
样本数据 1
| work_id | work_name | recording_id | release_id | rec_name | year | month | day |
|---------|---------------------|--------------|------------|-----------------------------------------------------|------|-------|-----|
| 201 | Me ha dicho la luna | 253 | 5 | Me ha dicho la luna | 1998 | 4 | 22 |
| 201 | Me ha dicho la luna | 579 | 528 | Me ha dicho la luna (Moonlight Radio Edit) | 1998 | | |
| 201 | Me ha dicho la luna | 580 | 528 | Me ha dicho la luna (Luna llena Ambience Mix) | 1998 | | |
| 201 | Me ha dicho la luna | 581 | 528 | Me ha dicho la luna (Extended Callejuela's Version) | 1998 | | |
| 201 | Me ha dicho la luna | 582 | 528 | Me ha dicho la luna (Stoned Baby Free Version) | 1998 | | |
| 201 | Me ha dicho la luna | 252 | 1 | Me ha dicho la luna (con Chayanne) | 2006 | | |
样本数据 2
| work_id | work_name | recording_id | release_id | rec_name | year | month | day |
|---------|------------|--------------|------------|---------------------------------------------------------|------|-------|-----|
| 401 | Si amanece | 397 | 26 | Si amanece | 1978 | 7 | 1 |
| 401 | Si amanece | 634 | 309 | Si amanece | 1978 | 7 | 1 |
| 401 | Si amanece | 396 | 257 | Si amanece (con el Mariachi Oro y Plata de Pepe Chávez) | 1979 | | |
| 401 | Si amanece | 564 | 188 | Si amanece | 2001 | | |
| 401 | Si amanece | 394 | 213 | Si amanece | 2001 | | |
| 401 | Si amanece | 395 | 1 | Si amanece | 2006 | | |
| 401 | Si amanece | 638 | 295 | Si amanece | | | |
【问题讨论】:
-
在您的预期结果中,第 3 行如何获得
recording_id = 128和name= My self II? -
@tcadidot0 你问得对,因为我在我的例子中犯了一个错误。现在修好了它应该返回
recording_id = 23和name=My self (r) -
@Marco,我对 release.day 字段中的 NULL 值有些困惑。如何用 NULL day 猜出最旧的值?
-
@SlavaRozhnev 这是一个很好的观点。有时我没有
release专辑的日期、月份甚至年份。 -
因此,您需要确定 NULL 值是旧值还是新值,然后是其他带有数字的值
标签: mysql sql join sql-order-by mysql-5.7