MySQL SELECT Counter, Group By - PullRequest
       3

MySQL SELECT Counter, Group By

3 голосов
/ 31 марта 2011

Я не уверен, возможно ли то, что я прошу ... но это, вероятно, лол.

По сути, у меня есть две таблицы, треки и альбомы.

Я хочу отобразить список всех треков и получить название из части альбомов.

Таблицы выглядят так:

tbl_tracks
id - int, auto increment, primary key
album_id - int
title - varchar 50

и

tbl_albums
id - int, auto increment, primary key
title - varchar 50

Теперь я запускаю запрос:

ВЫБРАТЬ tbl_tracks. title, tbl_albums. title ОТ tbl_tracks, tbl_albums ГДЕ tbl_tracks. album_id = tbl_albums. id GROUP BY tbl_tracks. title

Теперь распечатывается следующий список:

Track1 Artist1
Track2 Artist1
Track3 Artist1
Track1 Artist2

etc..etc ..

(Названия треков не опубликованы, я сделал это для ясности)

Теперь я хочу выбрать еще один столбец, который нумерует каждую дорожку по исполнителю, чтобы приведенный выше запрос вывел:

1 Track1 Artist1
2 Track2 Artist1
3 Track3 Artist1
1 Track1 Artist2

Но я хочу сделать это без каких-либо других столбцов, добавленных в базу данных или без серверных циклов, как бы я это сделал?

Ответы [ 2 ]

3 голосов
/ 31 марта 2011
SELECT @rn := if(@g = tbl_albums.id, @rn+1, 1) rownumber,
       tbl_tracks.title, tbl_albums.title,
  @g := tbl_albums.id
FROM (select @g:=null, @rn:=0) initvars
CROSS JOIN tbl_tracks
INNER JOIN tbl_albums on tbl_tracks.album_id = tbl_albums.id
ORDER BY tbl_albums.id, tbl_tracks.title;
0 голосов
/ 31 марта 2011

Нам нужно сделать что-то вроде ROW_NUMBER () OVER (Partition By AlbumTitle).Основываясь на уловке, определенной в этой статье для Аналитических функций в MySQl.

SELECT MO.*,
       @_rowNumber := @_rowNumber + 1
  FROM
       (
        SELECT m.*
          FROM
               (
                Select @_albumTitle := NULL
               ) V,
               (
                SELECT tbl_tracks.title As TrackTitle, 
                       tbl_albums.title As AlbumTitle
                  FROM tbl_tracks, 
                       tbl_albums 
                 WHERE tbl_tracks.album_id = tbl_albums.id
               ) m
         ORDER BY m.AlbumTitle,m.TrackTitle
       ) MO
 WHERE (CASE WHEN @_albumTitle IS NULL 
               OR @_albumTitle <> MO.AlbumTitle THEN @_rowNumber := 0 END IS NOT NULL)
   AND (@_albumTitle := MO.AlbumTitle) IS NOT NULL

ПРИМЕЧАНИЕ. У меня есть опыт работы только с MS SQL, поэтому этот запрос может быть синтаксически неправильным.И этот запрос не проверен в MySql.Я просто прочитал код из статьи выше и попытался следовать тому же подходу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...