如何获取列表中的列表(类似于多维数组)?

时间:2009-09-16 23:56:17

标签: sql mysql

这是我经常遇到的问题,我的解决方案总是要运行大量查询,但我觉得必须有更好的方法。以下是此示例的两个表:

  

艺术家
  ID
  名称

     

歌曲
  ID
  artistID
  命名
  类型

表格如下链接:
artists.id< - > songs.artistID

我想获取所有艺术家的列表,同时获取每位艺术家的所有歌曲列表。我想在结果集中避免重复的艺术家名称,这样我就不必在PHP中清理数据集了。以下是我希望数据格式的示例:

array(0 => array('name' => 'Artist A'
                  , 'songs' => array(0 => array('name' => 'Song 1'
                                               , 'genre' => 'rock'
                                               )
                                     )
                                     1 => array('name' => 'Song 2'
                                               , 'genre' => 'rock'
                                               )
                                     )
                 )
      1 => array('name' => 'Artist B'
                  , 'songs' => array(0 => array('name' => 'Song 3'
                                               , 'genre' => 'rap'
                                               )
                                     )
                                     1 => array('name' => 'Song 4'
                                               , 'genre' => 'rap'
                                               )
                                     )
                 )
      )

(我知道这不是MySQL格式,但它是我能解释的最接近的方式)

这可能吗?如果是这样,怎么样?

谢谢!

3 个答案:

答案 0 :(得分:1)

我能建议的最好的事情是查询父记录,然后使用in(父id列表)查询查询子项。这将为您提供两个数据集。一个给父母,一个给孩子。在客户端,您可以获取父ID并获取一组子记录。

答案 1 :(得分:1)

选项1:

  1. 查询艺术家表
  2. 每位艺术家:
    1. 将信息存储到数组中。
    2. 查询歌曲表并将结果附加到数组
  3. 优点:
    没有从数据库传递不必要的信息。

    缺点:
    可能会运行大量的查询。

    选项2:

    1. 使用JOIN查询两个表(可能是最好的左连接),按艺术家排序
    2. 每行:
      1. 检查此行的艺术家是否与上一行相同:
        • 如果没有,请将艺术家信息存储到数组的顶层
      2. 将歌曲信息存储到艺术家阵列的子阵列中
    3. 优点:
      只需要一个查询。

      缺点:
      可能从数据库中传递了大量不必要的数据。

答案 2 :(得分:0)

我担心不可能做你想要的事情,因为SQL本质上是一种基于集合的语言。您可以通过使用表连接在一次调用中获取所有要查找的信息,但之后,您必须解析它们并将它们存储到您提到的结构中。