0

product_descriptionからすべてを取得し、order_productから説明を取得しようとしています。

order_productに結果がない場合、結果が得られないということです。(product_descriptionに何かがある場合でも)

おそらくサブクエリが必要ですが、その方法がわかりません。

任意のアイデアをいただければ幸いです

SELECT *
FROM
  " . DB_PREFIX . "product_description
  INNER JOIN " . DB_PREFIX . "order_product ON (" . DB_PREFIX . "product_description.product_id = " . DB_PREFIX . "order_product.product_id)
WHERE
  order_id = '" . (int)$order_id . "'
AND " . DB_PREFIX . "product_description.language_id = 2")
4

1 に答える 1

1

これは仕組みによるINNER JOINものです。内部結合は、テーブル A のすべての行をテーブル B のすべての行と比較し、フィルター条件に一致する行のみを返します。

order_product に行がない場合、一致は失敗し、内部結合は何も返しません。

あなたが欲しいのはですOUTER JOIN。具体的には、LEFT JOIN

これを試して:

SELECT *
FROM
  " . DB_PREFIX . "product_description
  LEFT JOIN " . DB_PREFIX . "order_product ON (" . DB_PREFIX . "product_description.product_id = " . DB_PREFIX . "order_product.product_id)
WHERE
  order_id = '" . (int)$order_id . "'
AND " . DB_PREFIX . "product_description.language_id = 2")

これで、product_description から order_id = $order_id に一致するすべての行が取得されます。order_product に product_id に一致する行がない場合、order_product のフィールドは次のようになります。NULL

また、エイリアスを使用してクエリをクリーンアップします。ショートカットを作成するために使用してテーブルに名前を付けることができ、AS 実際に必要な列のみを選択する必要があります(説明で述べたように)

SELECT pd.*, op.description
FROM " . DB_PREFIX . "product_description AS pd
    LEFT JOIN " . DB_PREFIX . "order_product as op
    ON (pd.product_id = op.product_id)
WHERE
    pd.order_id = '" . (int)$order_id . "'
    AND pd.language_id = 2

また、$order_id を使用する場合のように、変数をクエリに補間することには十分注意してください。これがユーザーから送信されたデータである場合、厄介な驚きに直面する可能性があります。

これに対処するために使用している言語とSQLライブラリを使用して、準備されたステートメントを調査します。例を提供しますが、使用している言語または API がわかりません。

于 2013-03-20T14:56:17.483 に答える