从表中选择多行并以CSV格式连接

时间:2011-11-22 16:18:09

标签: android sql sqlite

假设我有两张桌子:

album
    album_id
    album_name

song
    album_id
    song_name
    track_number

我想创建一个SQL查询,给定album_id,将在一个字段中返回album_name,并在逗号分隔列表中返回所有song_name,在另一个字段中track_number

最终结果将是一行,一行,两列:

  

album_name:“某些专辑名称”

     

歌曲:“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)

这是错的,但我认为我的方向正确

这在Android上的sqlite3中是否可行?你能告诉我怎么样吗?

**编辑** 根据ypercube的优秀答案,有效,有没有办法添加另一个字段,就像歌曲,但我们称之为音乐家。

所以新表是

musician
    album_id
    musician_name
    musician_number

我的光标现在会给我一个结果:

  

album_name:“某些专辑名称”

     

歌曲:“song1,song2,song3,song4”

     

音乐家:“musician1,musician2,musician3”

音乐家的值是否按musician_number排序?

2 个答案:

答案 0 :(得分:2)

我认为您不能在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

答案 1 :(得分:0)

您不能直接执行此操作,但可以通过类似select album_name, song_name from album natural join song ... ...的常规查询来获取所需的字段,然后使用光标迭代结果集以构建逗号分隔的字符串。完成CSstring的构建后,可以将其写在CSV文件中。