SQL - две колонки сгруппированы по функциям с функцией MAX - PullRequest
0 голосов
/ 29 мая 2018
SELECT artist.name, recording.name, MAX(recording.length)
FROM recording 
INNER JOIN (artist_credit 
            INNER JOIN (artist_credit_name 
                        INNER JOIN artist 
                                ON artist_credit_name.artist_credit=artist.id)
                    ON artist_credit_name.artist_credit=artist_credit.id)
        ON recording.artist_credit=artist_credit.id
WHERE artist.gender=1 
  AND recording.length <= (SELECT MAX(recording.length) FROM recording)
GROUP BY artist.name, recording.name
ORDER BY artist.name

Мы используем базу данных MusicBrainz для школы, и у нас возникают проблемы с «GROUP BY», потому что у нас есть два столбца (он работает с одним столбцом, но не с двумя).Мы хотим, чтобы результат отображал только одного исполнителя с его вторым самым длинным временем записи, но код отображает все время записи каждой песни одного и того же исполнителя.Какие-либо предложения?Благодаря.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Как уже отмечали другие, оператор соединения может быть сокращен.Также, кажется, есть проблема с оператором в операторе AND;он должен быть <, а не <=, чтобы получить вторую по величине длину (см. здесь: <a href="/11826/kakoi-samyi-prostoi-sql-zapros-dlya-poiska-vtorogo-po-velichine-znacheniya"> Какой самый простой SQL-запрос для поиска второго по величине значения? ).

Я бы предложил попробовать следующее:

SELECT artist.name, recording.name, MAX(recording.length)
FROM recording 
JOIN artist ON recording.artist_credit = artist.id
WHERE 
    artist.gender=1 
    AND 
    recording.length < (SELECT MAX(recording.length) FROM recording)
GROUP BY artist.name
ORDER BY artist.name
0 голосов
/ 29 мая 2018

Вам не нужно делать несколько объединений, внимательно следя за условиями объединения.Их можно уменьшить до одного соединения, как показано ниже.

SELECT DISTINCT B.name, A.name, A.length
FROM recording A JOIN artist B
ON A.artist_credit=B.id
WHERE B.gender=1
AND A.length=(SELECT C.length FROM recording C    
              WHERE C.artist_credit=B.artist_credit 
              ORDER BY C.length LIMIT 1, 1)
ORDER BY B.name;

См. Использование MySQL LIMIT для получения n-го наибольшего значения

...