我有一个名为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,但不知道如何实现。 任何意见将是有益的。 谢谢。
答案 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 many和eager load with
method,您可以通过以下方式获得相同的结果:
Group::with("member")->get();
我不知道其他框架,我敢肯定还有其他框架也可以做到这一点。