php - 将两个表的结果合并为 JSON

标签 php mysql json

I asked a similar question before但问题中没有包含 book_no 列,并且由于我想要的解决方案必须包含此列才能为我提供正确的 JSON 结构,因此我得到的解决方案不起作用。因此,我将使用正确的信息重新发布此内容。

我有两个表,单词段落words表如下:

+----+---------+--------------+---------+---------+
| id | book_no | paragraph_no | word_no |   word  |
+----+---------+--------------+---------+---------+
|  1 |    1    |       1      |    1    |  hello  |
+----+---------+--------------+---------+---------+
|  2 |    1    |       1      |    2    |  how    |
+----+---------+--------------+---------+---------+
|  3 |    1    |       1      |    3    |  are    |
+----+---------+--------------+---------+---------+
|  4 |    1    |       1      |    4    |  you    |
+----+---------+--------------+---------+---------+

paragraph表格如下:

+----+---------+--------------+-------------------+
| id | book_no | paragraph_no |     paragraph     |
+----+---------+--------------+-------------------+
|  1 |    1    |       1      | hello how are you |
+----+---------+--------------+-------------------+

我希望将 words 表中 WHERE book_no 为 1 的所有列以及段落表中具有相同 WHERE 子句的段落列全部包含在一个 JSON 结果中。像这样:

{
    "1": [ <-- this is paragraph_no

        "words": [

            {
                "id": "1",
                "word_no": "1",
                "paragraph_no": "1",
                "word": "hello"
            },
            {
                "id": "2",
                "word_no": "2",
                "paragraph_no": "1",
                "word": "how"
            },

            // and so on...

        ],

        "paragraph": [

            {
                "paragraph": "hello how are you"
            }

        ]

    ]
}

请原谅我的模型,但我需要类似的东西。我当前仅获取单词的 PHP 代码是:

$result = $conn->query("SELECT * FROM words WHERE book_no = 1");

$data = array();

while ($row = $result->fetch_assoc()) $data[$row['paragraph_no']][] = $row; // paragraph_no from 'words' table

$API_RESULT = json_encode($data, JSON_UNESCAPED_UNICODE);

echo $API_RESULT;

它只输出这样的单词:

{
    "1": [ <-- this is paragraph_no

        {
            "id": "1",
            "word_no": "1",
            "paragraph_no": "1",
            "word": "hello"
        },
        {
            "id": "2",
            "word_no": "2",
            "paragraph_no": "1",
            "word": "how"
        },

        // and so on...

    ]
}

如何获得所需的 JSON 输出?

最佳答案

这段代码能产生您需要的输出吗?

$result_w = $conn->query("SELECT * FROM words;");
$results_w = $result_w->fetch_all(MYSQLI_ASSOC);

$words_per_paragraph = [];
foreach($results_w as $key => $row) {
    $words_per_paragraph[$row['paragraph_no']][] = $row;
}

$result_p = $conn->query("SELECT * FROM paragraph;");
$results_p = $result_p->fetch_all(MYSQLI_ASSOC);

$data = [];
foreach($results_p as $key => $row) {
    $p_no = $row['paragraph_no'];
    $words = [];
    if(array_key_exists($p_no, $words_per_paragraph)) {
        $words = $words_per_paragraph[$p_no];
    }
    $data[$p_no] = [
        'words' => $words,
        'paragraph' => $row
    ];
}

$data 的内容(出于测试目的,我没有在第 2 段中添加任何单词):

{
   "1":{
      "words":{
         "id":"4",
         "book_no":"1",
         "paragraph_no":"1",
         "word_no":"4",
         "word":"you"
      },
      "paragraph":{
         "id":"1",
         "book_no":"1",
         "paragraph_no":"1",
         "paragraph":"hello how are you"
      }
   },
   "2":{
      "words":[

      ],
      "paragraph":{
         "id":"3",
         "book_no":"1",
         "paragraph_no":"2",
         "paragraph":"I'm fine and you?"
      }
   }
}

也许您可以更改数据库表结构,以在一条语句中获取所有内容。

关于php - 将两个表的结果合并为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55680953/

相关文章:

php - Composer 不会通过存储库> 类型> 路径自动加载文件

php - 具有许多 where 子句组合的 MySql 查询

php - 需要使用 Concrete5 中外部表单的 SHA512 加密整个表

json - 在 shell 中解析 JSON

java - 在自定义注解中实现@RequestBody的功能

http请求后ios解析json结果

php - 如何使用 php 从 mysql 数据库访问特定值?

PHP - 定义常量与使用 config.ini

mysql - 如何从 mysql 表中获取 CHECKSUM 生成的数字?

C# Winforms : Mysql Database export to Excel error