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 回答