これは仕組みによる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 がわかりません。