这是因为如何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。