【问题标题】:Mysql Nested and declare as arrayMysql嵌套并声明为数组
【发布时间】:2019-12-03 09:40:35
【问题描述】:

我有 2 个表想要调用并从中创建另一个数组。 第一个表是groups

| id |  name   | type |
  1    premium    pr
  2    basic      bs

第二个表是子组

| id |  group_id   |    name   |
  1        1          forever
  2        2          short

其实我想展示这样的代码。让另一个数组函数声明为子组

Array ( 
[id] => 1 
[name] => Premium 
[type] => pr 

)[sub-groups] => Array (
[0] => Array (
[id] => 1
[group_id] => 1
[name] => forever))

我创建了这个 PDO sql 连接

=================编辑代码====================

function getGroups(){
    global $conn;
    $stmt = $conn->prepare("SELECT * FROM groups");
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $groups = $stmt->fetchAll();
    foreach($groups as $key => $val){

        $stmt = $conn->prepare("SELECT * FROM sub_groups WHERE group_id = {$val['id']}");
        $stmt->execute();
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
        $program = $stmt->fetchAll();
        foreach($program as $key => $val){
            $groups['sub-groups'] = $program;
        }
    }
    return $groups;
}

代码成功显示组 Premium 和 Basic,但未显示主要组内的 子组。我错过了什么? 任何有帮助的人都会很好。

【问题讨论】:

  • 子组与子减组相同
  • 对不起,我听不懂你的意思
  • LEFT JOIN sub-groupsLEFT JOIN sub MINUS groups 相同
  • 您将不得不为具有相同名称的 2 列别名,即 2 name
  • 我希望输出有一个以键为名称的数组。 Array ([id] => 1 [name] => Premium [type] => pr [sub-groups] => Array ([id] => 1 [group_id] => 1 [name] => forever ))

标签: mysql arrays nested declare


【解决方案1】:

数组键必须是唯一的。如果您有两列同名,则只有其中一列可以出现在结果的关联数组中。

您需要为至少一个具有相同名称的列分配别名,以便它在结果中以不同方式显示。

SELECT g.name as group_name, sg.group_id, sg.id AS subgroup_id, sg.name AS subgroup_name
FROM groups AS g
LEFT JOIN subgroups AS sg ON sg.group_id = g.id

当您创建 PHP 结果时,$groups['sub-groups'] 需要是一个数组。每次循环都用一个元素覆盖它。

<?php
function getGroups(){
    global $conn;
    $groups = [];
    $stmt = $conn->prepare("
                SELECT g.name as group_name, sg.group_id, sg.id AS subgroup_id, sg.name AS subgroup_name
                FROM groups AS g
                LEFT JOIN subgroups AS sg ON sg.group_id = g.id");
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    while ($row = $stmt->fetch()){
        if (!isset($groups[$row['group_name']])) {
            $groups[$row['group_name']] = $row;
            $groups[$row['group_name']]['sub-groups'] = [$row['subgroup_name']];
        } else {
            $groups[$row['group_name']]['sub-groups'][] = $row['subgroup_name'];
        }
    }
    return $groups;
}

【讨论】:

    猜你喜欢
    • 2019-03-27
    • 2023-04-06
    • 2020-07-29
    • 2019-10-28
    • 2019-03-23
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多