Выберите несколько строк из таблицы и присоединитесь как CSV - PullRequest
0 голосов
/ 22 ноября 2011

Допустим, у меня есть две таблицы:

album
    album_id
    album_name

и

song
    album_id
    song_name
    track_number

и я хотел бы создать SQL-запрос, который с учетом album_id вернет album_name в одном поле и все song_name в списке через запятую, упорядоченном по track_number в другом поле.

Конечным результатом будет курсор с одной строкой и двумя столбцами:

название_альбома: «Некоторое название альбома»

песни: "song1, song2, song3, song4"

Я думаю, мне нужно что-то вроде этого:

SELECT a.*,  group_concat(s.name ORDERBY s.track_number SEPERATOR ', ')
FROM album a
LEFT JOIN songs s
WHERE (a.album_id=1)

Это неправильно, но я думаю, что я на правильном пути

Возможно ли это в sqlite3 на Android? Можете ли вы сказать мне, как?

** РЕДАКТИРОВАТЬ ** Исходя из превосходного ответа ypercube, который работает, есть ли способ добавить другое поле, очень похожее на песню, но давайте назовем его музыкантом.

Итак, новая таблица

musician
    album_id
    musician_name
    musician_number

и мой курсор теперь выдаст мне результат:

название_альбома: "Some Album Name"

песни: "song1, song2, song3, song4"

музыкант: "музыкант1, музыкант2, музыкант3"

со значением музыканта, отсортированным по номеру музыканта?

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Я не думаю, что вы можете выбрать порядок в sqlite GROUP_CONCAT(), только разделитель. См. Aggregate functions in SQLite:

SELECT a.*
     , group_concat(s.name, ', ')
FROM album a
  LEFT JOIN songs s
    ON s.album_id = a.album_id
WHERE a.album_id = 1       --- skip this line for all the albums to be displayed
GROUP BY a.album_id

или (надеюсь) получить заказ, который вы хотите:

SELECT a.*
     , song_list
FROM a
  INNER JOIN
    ( SELECT album_id
           , group_concat(name, ', ') song_list
      FROM
        ( SELECT a.album_id
               , s.name
          FROM a 
            LEFT JOIN songs s
              ON s.album_id = a.album_id
          WHERE a.album_id = 1      
          ORDER BY a.album_id
                 , s.track_number
        ) g
      GROUP BY a.album_id
    ) grp
    ON grp.album_id = a.album_id

Если у вас есть другая таблица для group_concat:

SELECT a.*
     , song_list
     , artist_list
FROM a
  INNER JOIN
    ( SELECT album_id
           , group_concat(name, ', ') song_list
      FROM
        ( SELECT a.album_id
               , s.name
          FROM a 
            LEFT JOIN songs s
              ON s.album_id = a.album_id
      --- WHERE a.album_id = 1      
          ORDER BY a.album_id
                 , s.track_number
        ) g
      GROUP BY a.album_id
    ) grp
    ON grp.album_id = a.album_id
  INNER JOIN
    ( SELECT album_id
           , group_concat(artist_name, ', ') artist_list
      FROM
        ( SELECT a.album_id
               , r.artist_name
          FROM a 
            LEFT JOIN artists r
              ON r.album_id = a.album_id
      --- WHERE a.album_id = 1      
          ORDER BY a.album_id
                 , r.artist_order
        ) g2
      GROUP BY a.album_id
    ) grp2
    ON grp2.album_id = a.album_id
0 голосов
/ 22 ноября 2011

Вы не можете сделать это напрямую, но вы можете выбрать нужные поля с помощью обычного запроса, подобного select album_name, song_name from album natural join song ... ..., а затем выполнить итерацию набора результатов с помощью курсора, чтобы создать строку, разделенную запятыми.Когда вы закончите сборку CSstring, вы можете записать ее в файл CSV.

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