使用fetch进行显示时获取子数据?

时间:2016-05-11 13:31:45

标签: php mysql

我正在处理用户可以创建笔记的内容。

笔记有id,owner_id和数据。 实际上当页面加载时我做了一个基本的SELECT查询来获取用户的所有注释并用PHP循环和fetch显示它:

$stmt = $conn->prepare("SELECT id, data FROM notes WHERE owner = ?");
$stmt->bind_param("s", $_SESSION["id"]);

[...]

while($stmt->fetch()){
    display_note($note_id, $data);
}

注释表如下所示:

Note(id, owner, data)

我要做的是在笔记中添加标签。为此,创建了两个附加表:

Tags(id, name)
Note_tags(note_id, tag_id)

因此,当用户添加标记时,我的PHP代码会查看标记名称是否已存在获取该标记的ID或改为创建它并获取新创建的标记ID。

然后我在note_tags表中添加了一个带有注释ID和标签ID的条目。

问题是我不知道如何在我的提取循环中一个接一个地显示音符时获取音符的所有标签。

我认为我必须对每个音符进行SELECT查询,但我认为这不是最好的解决方案。例如,如果用户有超过100个笔记,那么制作100个查询是不是一个好主意?

如果它们不是更好的解决方案,那么如何在PHP中进行嵌套查询?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您需要构建一个多维数组。

首先,获取所有注释和标签:

SELECT notes.id, data, tag_id, tags.name AS tag_name
FROM notes
LEFT JOIN note_tags ON note_id = tag_id
LEFT JOIN tags ON tags.id = tag_id
WHERE owner = ?

然后迭代结果以构建数组

$data = array();
while($row = $stmt->fetch()){
    $data[$row["id"]]["data"] = $row["data"];
    $data[$row["id"]]["tags"][$row["tag_id"]] = $row["tag_name"];
} 

现在你应该有一个如下所示的数组:

[
    {
        "data":"The content of a note",
        "tags": [
            "the name of a tag",
            "the name of an other tag"
        ]
    },
    {
        "data":"The content of an other note",
        "tags": [
            "the name of a tag",
            "the name of an other tag"
        ]
    }
]