我正在尝试从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")
答案 0 :(得分: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。