Нужна помощь с PHP и MySQL…

У меня есть таблица песен, некоторые песни - альбомные, а некоторые - синглы... И у меня есть таблица альбомов...

Столбцы таблицы песен: Song_ID, Album_ID, Song_Name, Date_Released, Timestamp_Released, другие... Если Album_ID равен [null], это означает, что песня является синглом.

Столбцы таблицы альбомов: Album_ID, Album_Name, Song_IDs, Date_Released, другие...

Примечание 1: в таблице альбомов нет Timestamp_Released

Примечание 2: Date_Released — это всего лишь день без времени, т. е. «2011-06-16».

В настоящее время я использую этот запрос для отображения таблицы (на моей странице html/php), в которой каждая строка является отдельной или альбомом (песни, которые находятся в альбоме, отображаются в одной строке как альбом)

SELECT 
    IF(Album_ID IS NULL,s.Song_Name,a.Album_Name) as name, 
    IF(Album_ID IS NULL,s.Date_Released,a.Date_Released) as datereleased, 
    s.Timestamp_Released
FROM songs s LEFT JOIN albums a ON (s.Album_ID = a.Album_ID)
GROUP BY 1,2
ORDER BY 2 DESC,1
LIMIT 0,10; 

Приведенный выше запрос упорядочивает список песен и альбомов по дате и дает альбомам Date_Released и Timestamp_Released самой старой песни в альбоме...

Итак, мой вопрос: как дать альбому Date_Released и Timestamp_Released самой новой песни в нем?

Спасибо :)


person Andy    schedule 16.06.2011    source источник
comment
Вы пробовали ORDER BY 2 ASC,1 вместо ORDER BY 2 DESC,1   -  person Adithya Surampudi    schedule 17.06.2011
comment
Это не делает то, что я хочу...   -  person Andy    schedule 17.06.2011
comment
просто из любопытства, почему у песен на альбоме разные даты выпуска?   -  person horatio    schedule 17.06.2011
comment
Не ответ, но я просто хочу сказать, что наличие идентификаторов песен в таблице альбомов, мягко говоря, не нужно. И у вас должна быть только дата выпуска альбомов. Если это сингл, то все в порядке — просто добавьте тип в таблицу альбомов — ep, lp, double lp или single. И как песни с одного и того же альбома могут быть выпущены в разное время? Просто странно. По-моему, очень неэффективная конструкция.   -  person AR.    schedule 17.06.2011
comment
@horatio & @AR: я просто использую эту возможность ... также мне любопытно, как я могу сделать это в php и sql: P ...   -  person Andy    schedule 17.06.2011


Ответы (1)


Вместо s.Date_Released, s.Timestamp_Released напишите MAX(s.Date_Released) as Newest_Date_Released, MAX(s.Timestamp_Released) as Newest_Timestamp_Releasd ОБНОВЛЕНИЕ

SELECT 
IF(Album_ID IS NULL,s.Song_Name,a.Album_Name) as name, 
MAX(IF(Album_ID IS NULL,s.Date_Released,a.Date_Released)) as datereleased, 
MAX(s.Timestamp_Released)
FROM songs s LEFT JOIN albums a ON (s.Album_ID = a.Album_ID)
GROUP BY 1
ORDER BY 2 DESC,1
LIMIT 0,10; 
person a1ex07    schedule 16.06.2011
comment
я пробовал это, но запрос вообще не работает, если я это сделаю, я получаю результат с 0 строками... - person Andy; 17.06.2011
comment
вы пытались вместо этого просто добавить еще один столбец для max(foo)? - person horatio; 17.06.2011
comment
@Andy: попробуйте обновленную версию (примечание: GROUP BY 1, а не BY 1,2) - person a1ex07; 17.06.2011
comment
есть проблема, они до сих пор упорядочены в таблице по дате самой старой песни... - person Andy; 17.06.2011