MySQL在一条语句中查询两个表

时间:2018-11-19 09:09:38

标签: php mysql

我有一个名为group的表,另一个名为member的表。 组具有groupId,名称等字段。 成员具有memberId,groupId,memberName等字段,其中groupId是组表的外键。 我想在一个语句中查询这两个表,以便结果输出如下。

[
  {
    "groupId": "8",
    "name": "Test Group 2",
    "status": "0",
    "member": [
      {
        "memberId": "1",
        "groupId": "8",
        "memberName": "tester 1"
      }
    ]
  }
]

我研究了INNER JOIN和UNION,但不知道如何实现。 任何意见将是有益的。 谢谢。

4 个答案:

答案 0 :(得分:0)

您可以使用联接

    SELECT * 
    FROM group 
    INNER JOIN member ON group.groupId = member.groupId

但结果为

    [
      {
        "groupId": "8",
        "name": "Test Group 2",
        "status": "0",
        "memberId": "1",
         "groupId": "8",
        "memberName": "tester 1"

      }
    ]

主行和明细行之间的每个连接行

SQL查询返回表格结果而不是嵌套结果

答案 1 :(得分:0)

您的问题很广泛,但这也许会对您有所帮助

SELECT user.memberName, group.name
FROM user 
INNER JOIN group ON group.groupId = user.groupId

未经测试,但这会从带有INNER JOIN

的表中选择组名和用户名

您还可以选择其他列,但请确保它们没有相同的名称。否则,选择将失败。 (您可以使用as关键字mentioned here解决该问题)

答案 2 :(得分:0)

这更多是一个PHP问题。像这样查询表:

SELECT
    group.groupId, group.name,
    member.memberId, member.memberName
FROM group
LEFT JOIN member ON group.groupId = member.groupId

这将为您提供每个组的列表以及与之关联的成员。然后,您需要将所有组合并在一起。 PHP代码的粗略概述:

$data = array();
foreach ($rows as $row) {

    // locate the item that contains data for this group
    $index = array_search($row["groupId"], array_column($data, "groupId"));

    if ($index === false) {
        // if the group is not found then create an item for it
        $data[] = array(
            "groupId" => $row["groupId"],
            "name" => $row["name"],
            "member" => array()
        );
        $index = count($row) - 1;
    }

    // left join could return one row for empty groups so...
    if ($row["memberId"] === null) {
        continue;
    }

    // insert the member detail inside group -> member array
    $data[$index]["member"][] = array(
        "memberId" => $row["memberId"],
        "memberName" => $row["memberName"]
    );
}

答案 3 :(得分:0)

您可以通过2个查询,数组列和数组映射来做到这一点。

第一个查询,获取所有需要的组,并将其提取到变量中,例如$groups

SELECT group_id, name, status FROM groups

然后从$groups获取所有group_id。

$groupIds = implode(',', array_column($groups, 'group_id'));

您将获得group_id的列表,以逗号分隔的字符串。然后在第二个查询中使用它:

"SELECT member_id, group_id, member_name FROM member WHERE group_id IN (" . $groupIds . ")"

$members中获取结果。最后的任务是合并结果。

foreach ($groups as $key => $group) {
    $groupMember = array_filter($members, function($member) use ($group) {
        return $group['group_id'] == $member['group_id'];
    });
    $group['member'] = $groupMember; // I don't know if this works
    $groups[$key] = $groupMember; // if previous line doesn't work
}

PS 如果您使用Laravel之类的PHP框架,这会容易得多。它具有eloquent one to manyeager load with method,您可以通过以下方式获得相同的结果:

Group::with("member")->get();

我不知道其他框架,我敢肯定还有其他框架也可以做到这一点。