0

このJSONデータを使用して効率的なmySQL INSERTクエリを作成しようとしています(明確にするためにJSONに変換されています):

[
    {
        "job": "Avocado Books Binding",
        "tasks": [
            "Finish collating the signatures",
            "Fix perfect binders",
            "Fold signatures"
        ]
    },
    {
        "job": "Prepress Workflow Development",
        "tasks": [
            "Research new proofing machines",
            "Find free proofing software"
        ]
    }
]

結果のテーブル構造は次のようになります (このデータを使用)

Table: Jobs
job_id   job_title
1        Avocado Books Binding
2        Prepress Workflow Development

Table: Tasks
task_id   task_description                    job_id
1         Finish collating the signatures     1
2         Fix perfect binders                 1
3         Fold signatures                     1
4         Research new proofing machines      2
5         Find free proofing software         2

ジョブとタスクが job_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
                )

        )

)
4

2 に答える 2

1

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();
}
于 2013-01-18T00:54:57.313 に答える
0

これを試して:

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;
于 2013-01-17T18:51:13.667 に答える