【问题标题】:How do I group this data into an array?如何将这些数据分组到一个数组中?
【发布时间】:2013-01-21 05:12:39
【问题描述】:

我的桌子是这样的:

artist_id | song_id | user_id
a1          s1        u1
a1          s2        u1
a2          s9        u1
a3          s15       u2

我希望我的输出看起来像:

Array
    (
    [u1] => Array
        (
         [a1] => Array
           (
               [0] => s1
               [1] => s2
           )
         [a2] => Array
           (
               [0] => s9
           )
   )
   [u2] => Array
        (
         [a3] => Array
           (
               [0] => s15
           )

   )

)

我应该从哪里开始?

我不确定我的方法是否最有效:

  • 抓住并分组user_id,循环通过他们。

  • 对于每个user_id,获取artist_id

  • 对于每个artist_id,抓住下面的song_ids。

有没有办法进行这个查询?

【问题讨论】:

  • 您的数据库是如何设置的?您是否有带有歌曲或艺术家表外键的用户表?你有映射表吗?
  • 是的,所以每一列都有自己的表格。本质上,我正在尝试获取用户以及他们所附加的艺术家,然后列出该艺术家下的所有歌曲。

标签: php mysql sql arrays group-by


【解决方案1】:

您可以从 MySQL 查询中得到以下结果集。使用任何一个库 PDO 或 MySQLi。

<?php
$results = array(
                0 => array('artist_id' => 'a1', 'song_id' => 's1', 'user_id' => 'u1'),
                1 => array('artist_id' => 'a1', 'song_id' => 's2', 'user_id' => 'u1'),
                2 => array('artist_id' => 'a2', 'song_id' => 's9', 'user_id' => 'u1'),
                3 => array('artist_id' => 'a3', 'song_id' => 's15', 'user_id' => 'u2')
            );
echo '<pre>';print_r($results);echo '</pre>';
?>

试试这个,

<?php
$new_array = array();

foreach($results as $keys=>$values) {
    $new_array[$values['user_id']][$values['artist_id']][] = $values['song_id'];
}
echo '<pre>';print_r($new_array);echo '</pre>';
?>

注意: 您无法从单个查询中获取它,这取决于结果集。我用你的结果集解释了,

【讨论】:

    【解决方案2】:

    据我所知,您需要表中的所有结果,没有count,没有sum,等等。

    所以在 SQL 查询中没有什么可以group by,只需将它们全部选中并在 PHP 中分组:

    $result=array();
    $mysqli_result=$mysqli->query("SELECT `artist_id`,`song_id`,`user_id` FROM `songs`");
    while($row=$mysqli_result->fetch_assoc())
    {
        if(empty($result[$row["user_id"]]))
            $result[$row["user_id"]]=array();
        if(empty($result[$row["user_id"]][$row["artist_id"]]))
            $result[$row["user_id"]][$row["artist_id"]]=array();
        $result[$row["user_id"]][$row["artist_id"]][]=$row["song_id"];
    }
    print_r($result);
    

    【讨论】:

    • 在将数据作为子数组推送之前,无需声明父级别。
    猜你喜欢
    • 2012-12-13
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    相关资源
    最近更新 更多