【问题标题】:MIN & MAX with a few JOINSMIN & MAX 有几个 JOINS
【发布时间】:2018-04-29 06:01:59
【问题描述】:

我正在尝试同时显示 MIN 和 MAX,同时加入一些表格以获取它们的信息。我正在获取 MIN 和 MAX,但它显示的其他字段信息有误。

SELECT
    SONG.SONG_NAME,
    ALBUM.ALBUM_NAME,
    ARTIST.ARTIST_NAME,
    MAX(SONG.LENGTH_SECONDS) AS LENGTH
FROM SONG
    JOIN ALBUM ON ALBUM.ALBUM_ID = SONG.ALBUM_ID
    JOIN ARTIST ON ARTIST.ARTIST_ID = SONG.ARTIST_ID
UNION
SELECT
    SONG.SONG_NAME,
    ALBUM.ALBUM_NAME,
    ARTIST.ARTIST_NAME,
    MIN(SONG.LENGTH_SECONDS)
FROM SONG
    JOIN ALBUM ON ALBUM.ALBUM_ID = SONG.ALBUM_ID
    JOIN ARTIST ON ARTIST.ARTIST_ID = SONG.ARTIST_ID;

这些是我通过查询得到的结果:

| SONG_NAME              | ALBUM_NAME                | ARTIST_NAME    | LENGTH |
+------------------------+---------------------------+----------------+--------+
| Fluorescent Adolescent | Favourite Worst Nightmare | Arctic Monkeys |    390 |
| Fluorescent Adolescent | Favourite Worst Nightmare | Arctic Monkeys |    177 |

【问题讨论】:

标签: mysql join union minmax


【解决方案1】:

您可以从 SELECT 中删除 MAX 和 MIN 并添加 TOP 1。然后添加 ORDER BY SONG.LENGTH_SECONDS 以获得最短的歌曲和 ORDER BY SONG.LENGTH_SECONDS DESC 以获得最长的歌曲。

SELECT TOP 1
    SONG.SONG_NAME,
    ALBUM.ALBUM_NAME,
    ARTIST.ARTIST_NAME,
    SONG.LENGTH_SECONDS AS LENGTH
FROM SONG
    JOIN ALBUM ON ALBUM.ALBUM_ID = SONG.ALBUM_ID
    JOIN ARTIST ON ARTIST.ARTIST_ID = SONG.ARTIST_ID
ORDER BY SONG.LENGTH_SECONDS DESC
UNION
SELECT TOP 1
    SONG.SONG_NAME,
    ALBUM.ALBUM_NAME,
    ARTIST.ARTIST_NAME,
    SONG.LENGTH_SECONDS AS LENGTH
FROM SONG
    JOIN ALBUM ON ALBUM.ALBUM_ID = SONG.ALBUM_ID
    JOIN ARTIST ON ARTIST.ARTIST_ID = SONG.ARTIST_ID;
ORDER BY SONG.LENGTH_SECONDS

【讨论】:

  • OP 使用的是 MySQL,而不是 SQL。 MySQL 不支持TOP
【解决方案2】:

假设您正在寻找每个艺术家和专辑的歌曲的最短和最长持续时间,并为这些歌曲获取 song_name

您可以使用按 SONG.ALBUM_ID、ALBUM.ALBUM_NAME、ARTIST.ARTIST_NAME 分组的并集 加入歌曲以获得正确的歌曲名称

select song.song_name, t.ALBUM_NAME, t.ARTIST_NAME, t.LENGTH
from song
inner join (
  SELECT 
      SONG.ALBUM_ID
      ALBUM.ALBUM_NAME,
      ARTIST.ARTIST_NAME,
      MAX(SONG.LENGTH_SECONDS) AS LENGTH
  FROM SONG
      JOIN ALBUM ON ALBUM.ALBUM_ID = SONG.ALBUM_ID
      JOIN ARTIST ON ARTIST.ARTIST_ID = SONG.ARTIST_ID 
  GROUP BY SONG.ALBUM_ID,ALBUM.ALBUM_NAME, ARTIST.ARTIST_NAME
) T on song.album_id = t.album_id and t.LENGTH = song.LENGTH_SECONDS 

UNION 

select song.song_name, t.ALBUM_NAME, t.ARTIST_NAME, t.LENGTH
from song
inner join (
  SELECT 
      SONG.ALBUM_ID
      ALBUM.ALBUM_NAME,
      ARTIST.ARTIST_NAME,
      MIN(SONG.LENGTH_SECONDS) AS LENGTH
  FROM SONG
      JOIN ALBUM ON ALBUM.ALBUM_ID = SONG.ALBUM_ID
      JOIN ARTIST ON ARTIST.ARTIST_ID = SONG.ARTIST_ID 
  GROUP BY SONG.ALBUM_ID,ALBUM.ALBUM_NAME, ARTIST.ARTIST_NAME
) T on song.album_id = t.album_id and t.LENGTH = song.LENGTH_SECONDS 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2012-08-26
    • 1970-01-01
    • 2023-03-19
    • 2017-08-05
    • 1970-01-01
    相关资源
    最近更新 更多