尝试使用MySQL中的键来组合来自两个表的结果集

时间:2012-06-06 14:34:34

标签: php sql

我在MySQL数据库中有两个数据表songsfiles

歌曲表:

  song_id   |   song_title    |
     1      |     A Title     |
     2      |     B Title     |

文件表:

  file_id   |    file_name    |  parent_id  |
    1       |    asong.mp3    |     1       |
    2       |    bsong.mp3    |     1       | 

我想创建一个SQL查询来返回这样的集合(其中song_id = 1):

song_id => 1
song_title => A Title
song_files = Array(
     0 => Array(
            file_id => 1
            file_name => asong.mp3
          )
     1 => Array(
            file_id => 2
            file_name => bsong.mp3
          )
)

理想情况下,我只想查询数据库一次,并且一直在探索JOIN,但我不相信这是我需要的方法。我正在使用PHP 5

非常感谢! 奥利

1 个答案:

答案 0 :(得分:1)

使用GROUP_CONCAT()聚合函数,该函数返回CSV个值,如下所示:

select song_id, song_title, group_concat(file_name) as file_names
from songs
join files on files.parent_id = songs.song_id
group by 1, 2

结果如下:

song_id | song_title | file_names
---------------------------------------------------
1       | A Title    | asong.mp3,bsong.mp3

如果你想要一个文件名数组,你必须在php代码中的逗号上分割file_names值。

group_concat返回的术语顺序未定义,但如果文件名的顺序很重要,则可以在 group_concat中嵌入order by 。例如,对于字母顺序使用:

group_concat(file_name order by file_name) as file_names

或文件创建订单使用:

group_concat(file_name order by file_id) as file_names