МИН и МАКС с несколькими СОЕДИНЕНИЯМИ

Я пытаюсь отобразить как 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 |

Предлагаю вам прочитать сообщение, что @lc. упомянул. Тогда было бы полезно, если бы вы могли сказать, каков ожидаемый результат запроса, поскольку это может помочь кому-то дать вам ответ.

Nick 29.04.2018 08:43
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
44
2

Ответы 2

Вы можете удалить MAX и MIN из SELECT и вместо этого добавить 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

Nick 29.04.2018 08:41

предполагая, что вы ищете минимальную и максимальную продолжительность песни для каждого исполнителя и альбома, и для этих песен получите имя_песни

Вы можете использовать объединение групп, сгруппированных по 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 

Другие вопросы по теме