Php 针对嵌入式数据集的mySQL插入和选择查询

Php 针对嵌入式数据集的mySQL插入和选择查询,php,mysql,select,group-by,Php,Mysql,Select,Group By,我正在尝试使用此JSON数据编写一个高效的mySQL INSERT查询(为了清晰起见,转换为JSON): 生成的表结构将是(使用此数据) 其中作业和任务由作业id关联 我还试图编写一个SELECT查询,以高效的方式获取这些数据 非常感谢您的帮助、推荐或建议。 更新: 作为PHP数组的结构 Array ( [0] => Array ( [job] => Avocado Books Binding [tasks] =

我正在尝试使用此JSON数据编写一个高效的mySQL INSERT查询(为了清晰起见,转换为JSON):

生成的表结构将是(使用此数据)

其中作业和任务由作业id关联

我还试图编写一个SELECT查询,以高效的方式获取这些数据

非常感谢您的帮助、推荐或建议。

更新:

作为PHP数组的结构

Array
(
    [0] => Array
        (
            [job] => Avocado Books Binding
            [tasks] => Array
                (
                    [0] => Finish collating the signatures
                    [1] => Fix perfect binders
                    [2] => Fold signatures
                )

        )

    [1] => Array
        (
            [job] => Avocado Books Binding
            [tasks] => Array
                (
                    [0] => Finish collating the signatures
                    [1] => Fix perfect binders
                    [2] => Fold signatures
                )

        )

)
试试这个:

SELECT j.job_id, GROUP_CONCAT(t.task_description) task 
FROM jobs j 
INNER JOIN tasks ON j.job_id = t.job_id 
GROUP BY j.job_id;

如果禁用PDO的准备好的语句模拟,那么重复执行此类(服务器端准备好的)语句将比执行多个未准备好的语句更有效:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

$insert_job = $dbh->prepare('
  INSERT INTO Jobs (job_title) VALUES (?)
');

$insert_task = $dbh->prepare('
  INSERT INTO Tasks (task_description, job_id) VALUES (:desc, :id)
');

$insert_task->bindParam(':desc', $task  , PDO::PARAM_STR);
$insert_task->bindParam(':id',   $job_id, PDO::PARAM_INT);

foreach (json_decode($json, TRUE) as $job) {
  $insert_job->execute([$job['job']]);
  $job_id = $insert_job->lastInsertId();
  foreach ($job['tasks'] as $task) $insert_task->execute();
}

如果可以的话,解释一下为什么会这样?我不仅仅是在寻找复制粘贴解决方案这将为您提供任务描述,其中的值由作业ID以逗号分隔。如果任何任务描述包含逗号,这将中断,因为您将无法恢复原始拆分。您可以更改
组\u concat
的分隔符,但这只会修改问题。您最好以合理的顺序一次迭代一行。SQL根本不是为嵌套结构设计的。你说的“高效”是什么意思?执行时间?需要内存吗?代码的数量/清晰度。。。?如果数据结构只是为了“清楚”而转换为JSON,那么它实际上是以什么形式存在的?考虑到执行时间和所需内存,效率很高。它以PHP数组的形式存在。您能更具体一点吗?数组中的数据是如何构造的?我已经添加了数据的PHP数组版本。我将数据作为JSON发送到服务器,但编码为PHP数组,看起来像我发布的结构
SELECT j.job_id, GROUP_CONCAT(t.task_description) task 
FROM jobs j 
INNER JOIN tasks ON j.job_id = t.job_id 
GROUP BY j.job_id;
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

$insert_job = $dbh->prepare('
  INSERT INTO Jobs (job_title) VALUES (?)
');

$insert_task = $dbh->prepare('
  INSERT INTO Tasks (task_description, job_id) VALUES (:desc, :id)
');

$insert_task->bindParam(':desc', $task  , PDO::PARAM_STR);
$insert_task->bindParam(':id',   $job_id, PDO::PARAM_INT);

foreach (json_decode($json, TRUE) as $job) {
  $insert_job->execute([$job['job']]);
  $job_id = $insert_job->lastInsertId();
  foreach ($job['tasks'] as $task) $insert_task->execute();
}