MYSQL查询问题和子查询

时间:2013-03-20 14:42:01

标签: mysql select subquery

我正在尝试从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")

1 个答案:

答案 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。