Android 从表中选择多行并作为CSV连接

Android 从表中选择多行并作为CSV连接,android,sql,sqlite,Android,Sql,Sqlite,假设我有两张桌子: album album_id album_name 及 我想创建一个SQL查询,给定一个album\u id,它将在一个字段中返回album\u name,并在一个逗号分隔的列表中返回所有的song\u name,按另一个字段中的track\u number排序 最终结果将是一个包含一行、两列的游标: 专辑名称:“一些专辑名称” 歌曲:“歌曲1,歌曲2,歌曲3,歌曲4” 我想我需要这样的东西: SELECT a.*, group_concat(s.name

假设我有两张桌子:

album
    album_id
    album_name

我想创建一个SQL查询,给定一个
album\u id
,它将在一个字段中返回
album\u name
,并在一个逗号分隔的列表中返回所有的
song\u name
,按另一个字段中的
track\u number
排序

最终结果将是一个包含一行、两列的游标:

专辑名称:“一些专辑名称”

歌曲:“歌曲1,歌曲2,歌曲3,歌曲4”

我想我需要这样的东西:

SELECT a.*,  group_concat(s.name ORDERBY s.track_number SEPERATOR ', ')
FROM album a
LEFT JOIN songs s
WHERE (a.album_id=1)
这是错误的,但我认为我是对的

这在Android上的sqlite3中可能吗?你能告诉我怎么做吗

**编辑** 根据ypercube出色的回答,有没有一种方法可以添加另一个领域,很像歌曲,但我们称之为音乐家

所以新表是

musician
    album_id
    musician_name
    musician_number
我的光标现在会给我一个结果:

专辑名称:“一些专辑名称”

歌曲:“歌曲1,歌曲2,歌曲3,歌曲4”

音乐家:“音乐家1,音乐家2,音乐家3”


使用按音乐家编号排序的音乐家值?

您不能直接这样做,但您可以通过定期查询来获取所需字段,如
选择唱片集名称,从唱片集自然加入歌曲中选择歌曲名称
,然后用光标迭代结果集以生成逗号分隔的字符串。构建完CSstring后,您可以将其写入CSV文件。

我认为您不能在sqlite的
GROUP_CONCAT()中选择顺序,只能选择分隔符。请参阅

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

如果您有另一个表要分组,\u 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

啊,实际上我不想要CSV文件——我想要一个光标,它有两列——一列是专辑名,另一列是所有歌曲的标题,用逗号隔开。我想我需要使用一个小组讨论功能-有什么想法吗?太棒了-这很好用。非常感谢。有没有一种简单的方法来添加列?假设我想要一个类似于歌曲名的艺术家名,给定一个[album_id,Artister_name,Artister_order]的添加表,
album
表中不是存储了艺术家信息吗?是的,所以我的最终结果现在是“album name”,“song 1,song 2,song 3”,“Artister 1,Artister 2,Artister 3”等等。我会更新问题。更新了问题-使用音乐家而不是艺术家,以避免一些混淆。稍微更改了答案。因此,您可以添加另一个类似的子查询。
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