0

私はしばらくこれに苦労しており、さまざまな情報源 (書籍 / Web / このサイト) を検索しましたが、まだ解決策が見つかりません. 私はそれほど長い間 PHP / MySQL を使用していないので、検索の対象となる関連言語を知らないかもしれません。ともかく...

私は基本的な注文管理システムを持っています。顧客は、テストしたいアイテムに対して複数の行を入力できます。各行には、テストするアイテムと、必要な一連のテストが含まれています。次に、テスト ラボがワークフローを管理できるように、これらの各項目を構成要素のテストに展開する必要があります。テストを注文項目と注文に結び付けることができる必要があります。

order_id フィールド (自動インクリメント) とその他の情報 (誰が注文したかなど) で全体的な注文がキャプチャされる注文テーブルがあります。次に、注文テーブルの order_id と、顧客が希望する各アイテム/テスト スイートの組み合わせを注文アイテム テーブルに入力します。各注文アイテムには order_item_id (自動インクリメント) があります。

$sql1="INSERT INTO tbl_order(od_date, od_customer_id)
    SELECT ct_date, ct_customer_id 
    FROM tbl_cart
    WHERE ct_customer_id='$customerID' AND ct_session_id='$sid'";
mysql_query($sql1);
// get order_id
$orderid=mysql_insert_id();

// save order details to tbl_order_item
$sql2="INSERT INTO tbl_order_item(cat_code, pd_code, pd_description, pc_code, smpl_type, test_suite_name)
    SELECT cat_code, pd_code, pd_description, pc_code, smpl_type, test_suite_name 
    FROM tbl_cart
    WHERE ct_customer_id='$customerID' AND ct_session_id='$sid'";
mysql_query($sql2);

//  update date fields
$sql3="UPDATE tbl_order SET od_date='$date' WHERE ct_date='0000-00-00 00:00:00'";
$sql4="UPDATE tbl_order SET od_username='$username' WHERE od_username=''";
mysql_query($sql3);
mysql_query($sql4);

// set the order id in the order item and lab item tables
$sql5="UPDATE tbl_order_item SET od_id='$orderid' WHERE od_id='0'";

それはすべて機能しますが、各注文項目を取得して関連するテストに展開しようとすると、行き詰まります。test_suite / test_name の組み合わせを示すテーブルを作成しましたが、出力を lab_item テーブルに挿入できません。

//$sql6="UPDATE tbl_lab_item SET od_id='$orderid' WHERE od_id=''";
mysql_query($sql5);

// Expand Suite into tests in lab item table
$sql7="INSERT INTO tbl_lab_item(od_id,test_name)
    VALUES ('$orderid',(SELECT test_name FROM tbl_suite_select  WHERE tbl_order_item.test_suite_name=tbl_suite_select.test_suite_name))";
mysql_query($sql7);

これをデータベースに対して直接実行する必要がありますか、それとも最初にデータを変数に引き出す必要がありますか? もしそうなら、どのように?

よろしくお願いします。

更新 私は今問題を解決しました。ご意見ありがとうございます。興味のある方は、これが最終的に解決したクエリです。それはすべて、最後のテーブルの選択で正しいテーブル/セルを呼び出すことにかかっていました。フィールドが欠落していたため、参照がありませんでした。

//  Insert individual tests into tbl_lab_item
$sql6="INSERT INTO tbl_lab_item(od_item_id, test_suite_name,test_name)
    SELECT tbl_order_item.od_item_id,tbl_order_item.test_suite_name,tbl_suite_select.test_name
    FROM tbl_order_item,tbl_suite_select
    WHERE tbl_order_item.test_suite_name=tbl_suite_select.test_suite_name";
mysql_query($sql6);
4

2 に答える 2

1

質問を完全に理解しているかどうかはわかりませんが、改善されたクエリがいくつかあります (pdo を使用)。私が追加した主なポイントは、最後のクエリの結合ステートメントだったと思います。また、以前のクエリのいくつかを組み合わせて、(更新ではなく挿入するのではなく) 行を一度に追加しました。私は何もテストしませんでした。

$sqlStmt = $pdo->prepare("
    INSERT INTO tbl_order
    (   od_date
    ,   od_customer_id
    ,   od_date
    ,   od_username)
    SELECT
        ct_date
    ,   ct_customer_id
    ,   ? AS od_date
    ,   ? AS od_username
    FROM tbl_cart
    WHERE ct_customer_id = ?
    AND ct_session_id = ?
");

$sqlStmt->execute(array(
    $date,
    $username,
    $customerID,
    $sid
));

$orderid = $pdo->lastInsertId();

$sqlStmt = $pdo->prepare("
    INSERT INTO tbl_order_item
    (   cat_code
    ,   pd_code
    ,   pd_description
    ,   pc_code
    ,   smpl_type
    ,   test_suite_name
    ,   od_id)
    SELECT 
        cat_code
    ,   pd_code
    ,   pd_description
    ,   pc_code
    ,   smpl_type
    ,   test_suite_name 
    ,   ? AS od_id
    FROM tbl_cart
    WHERE ct_customer_id = ?
    AND ct_session_id = ?
");
$sqlStmt->execute(array(
    $orderid,
    $customerID,
    $sid
));

$sqlStmt = $pdo->prepare("
    INSERT INTO tbl_lab_item
    (   od_id
    ,   test_name)
    SELECT
        ? AS od_id
    ,   tss.test_name
    FROM tbl_suite_select tss
    INNER JOIN tbl_order_item toi
    ON toi.test_suite_name = tss.test_suite_name
    WHERE toi.od_id = ?
");
$sqlStmt->execute(array(
    $orderid,
    $orderid
)); 
于 2013-01-16T16:47:23.977 に答える
0

これにより、コードが機能するコードに変換されます。

$sql7="INSERT INTO tbl_lab_item(od_id,test_name)
       SELECT '$orderid', test_name FROM tbl_suite_select 
       WHERE tbl_order_item.test_suite_name=tbl_suite_select.test_suite_name";

ただし、 where で適用される条件が十分かどうかはよくわかりません。

于 2013-01-16T16:38:40.353 に答える