0

以下にこのクエリがあります。注文ごとに2つの製品があるASSOCPRODUCTSテーブルを除いて、テーブルのすべての関係は1対1の関係です。クエリが1行のみを返すことを除いて、すべてが正常に機能しているように見えます。したがって、実際には2つある場合に1つの製品IDのみが返されます。orderIDごとに1つの注文しかないという点で、なぜ1つしかプルされないのか理解していますが、契約ごとに2つの関連商品があり、各商品IDを取得する必要があります。Assocproductsテーブルでは、contractsテーブルとの1対多であるため、各製品は独自の行を取得します。

内部結合を使用してその情報を取得することは可能ですか、それとも別のクエリを実行する必要がありますか?

$orderid = $_POST['orderid'];

$res = mysql_query ("
SELECT company.name as cname, 
    orders.datemade as datemade
    orders.p1quantity as p1q, 
    orders.p2quantity as p2q, 
    assocproducts.productid as pid,
    assocproducts.price as pprice, 
    inventory.name as pname, 
    inventory.quantity as pquantity 
FROM orders 
INNER JOIN contracts ON (contracts.id = orders.contractid)
INNER JOIN company ON (contracts.companyid = company.id) 
INNER JOIN assocproducts ON (contracts.id = assocproducts.contractid) 
INNER JOIN inventory ON (assocproducts.productid = inventory.id) 
WHERE orders.id = " . $orderid);

$order = mysql_fetch_assoc($res);

さらに情報が必要な場合はお知らせください。

この特定の注文の注文情報のみを表示する必要があるため、$orderはループしていません。これはクリック時のAJAXトリガーです。

ありがとう!

4

1 に答える 1

1

1行だけが返されると言っているのは間違っていると思います。クエリで使用された列のみを使用して新しいスキーマを作成し、サンプルデータを入力して、一致するすべての結果を取得しました。問題は関数の使い方にあると思いますmysql_fetch_assoc()この関数のセマンティクスは明らかです。

フェッチされた行に対応する文字列の連想配列を返します。行がない場合はFALSEを返します。

だから私の推測では、あなたは二度と電話をかけないでしょうmysql_fetch_assoc()

のセマンティクスINNER JOINとデータ制約が与えられると、クエリは常に0または1行を生成します。理由がわからない場合は、SQLJOINのタイプと動作をお読みください。したがって、注文の詳細関連製品に関する情報を取得するには、次の2つのオプションがあります。

  1. 2つの別々のselectステートメントを使用します。1つは注文の詳細(常に1行)用で、もう1つは関連製品(2行)用です。2番目のクエリの結果を繰り返します-フェッチされた行ごとに1つの製品に関する情報を取得します。
  2. 既存のクエリを保持しますが、すべての行を反復処理してデータを取得する方法を変更します(順序情報はフェッチされたすべての行に存在し、すべての行で同じになることに注意してください)。

    $firstRow = true;
    while (($order_product = mysql_fetch_assoc($res)) !== FALSE) {
        if ($firstRow) {
            // do something with order info
            // but don't repeat it for consecutive rows
            $firstRow = false;
        }
        // do something with currently fetched associated product info
    }
    

それは好みの問題ですが、私は最初のオプションを選びます-それはそれほどハッキーに見えません。

于 2012-12-04T23:28:35.017 に答える