2つのフォームを1つのidで紐付けても、一方のフォームでそのidの値が同じで重複する可能性もあります。

その場合、2つのテーブルを結びつける中間テーブルを作成して、紐付けidとは異なるこの識別子で具体的なテストセッションやグループを管理できます。

これによりどのテーブルが他のテーブルと関連づけられているかより明確になります。

MySQL

CREATE TABLE test_mappings (
    mapping_id INT AUTO_INCREMENT PRIMARY KEY
);

ALTER TABLE tests
ADD COLUMN mapping_id INT,
ADD CONSTRAINT fk_tests_mapping_id FOREIGN KEY (mapping_id) REFERENCES test_mappings(mapping_id);

ALTER TABLE test_patterns
ADD COLUMN mapping_id INT,
ADD CONSTRAINT fk_test_patterns_mapping_id FOREIGN KEY (mapping_id) REFERENCES test_mappings(mapping_id);

同じidの値を複製する方のバックエンド処理

こちらでフォーム入力を行ったと同時に、自動的に中間テーブルのデータを生成する。

中間データのidはmapping_idとする。

<?php
try {
    // 新しいmapping_idを生成
    $conn->beginTransaction();
    $conn->exec("INSERT INTO test_mappings () VALUES ()");
    $mappingId = $conn->lastInsertId();

    // test_questionsにデータを挿入
    $sql = "INSERT INTO tests (id, mapping_id) VALUES (:id, :mapping_id)";
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(':id', $id, PDO::PARAM_STR);
    $stmt->bindParam(':mapping_id', $mappingId, PDO::PARAM_INT);
    $stmt->execute();

    $conn->commit();
    echo "大問が作成され、マッピングIDが割り当てられました。";
} catch (PDOException $e) {
    $conn->rollBack();
    echo "エラー: " . $e->getMessage();
}
$conn = null;
?>

もう一方のテーブルに中間テーブルのidを紐づけるバックエンド処理

<?php
// ここで、ユーザーは既存のmapping_idを選択する
$selectedMappingId = $_POST['mapping_id'];  // ユーザーがフォームから送信したmapping_id

try {
    // mapping_idのデータを挿入
    $sql = "INSERT INTO test_patterns (id, mapping_id) VALUES (:id, :mapping_id)";
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(':id', $id, PDO::PARAM_STR);
    $stmt->bindParam(':mapping_id', $selectedMappingId, PDO::PARAM_INT);
    $stmt->execute();

    echo "パターンが設定され、選択されたマッピングIDが使用されました。";
} catch (PDOException $e) {
    echo "エラー: " . $e->getMessage();
}
$conn = null;
?>

これにより両方のデータを紐づけることができました。

2つのデータを結びつけて表示させます。

$stmt = $dbh->prepare("SELECT q.* FROM tests AS ts 
INNER JOIN test_types AS t ON q.test_type_id = ts.id
LEFT JOIN test_mappings AS tm ON tm.mapping_id = q.mapping_id
WHERE t.id = ? AND q.mapping_id = ? LIMIT 2");
$stmt->execute([$test_id, $mapping_id]);
$data_lists = $stmt->fetchAll(PDO::FETCH_ASSOC);
<?php foreach $data_lists as $list ?>
<p><?php echo $list['data']; ?></p>
<?php endforeach; ?>