【问题标题】:How to LEFT JOIN while using a filter on the LEFT table?在 LEFT 表上使用过滤器时如何 LEFT JOIN?
【发布时间】:2011-12-28 10:03:04
【问题描述】:

我有 2 个表要 LEFT JOIN 并过滤 LEFT 表上的结果。 这些表是: -product_table,包含列 id 和 product_name -order_table,包含列 id、product_id、product_order

我尝试从 id 为 1 的产品表中选择一行,并在产品 id 与产品表中的 id 相同的订单表中左连接。

我的第一次尝试是这样的:

SELECT * FROM product_table 
WHERE product_table.id = 1
LEFT JOIN order_table
ON order_table.product_id=product_table.id

对于这个查询,我遇到了语法错误。

所以我搜索了如何 LEFT JOIN 并从 LEFT 表中过滤结果,我发现在查询中使用了 LEFT JOIN 之后的 AND,如下所示:

SELECT * FROM product_table
LEFT JOIN order_table
ON order_table.product_id=product_table.id
AND product_table.id=1

但是这里的查询返回所有 product_table 行和所有对应的 order_table 行,全部连接,但我想要的只是 id 等于 1 的 product_table 行,并与相应的 order_table 行连接。 我该怎么做?

【问题讨论】:

  • 您的查询看起来不错。能否展示产品和订单的小数据样本?
  • 除非您正在编写数据库管理程序,否则不要使用SELECT *;只选择您需要的列。
  • 你的第一个查询是在join之后正确使用where子句。

标签: mysql join filter


【解决方案1】:

试试这个:

SELECT * 
  FROM product_table pt 
    LEFT JOIN order_table ot 
      ON ot.product_id=pt.id
  WHERE pt.id = 1

【讨论】:

  • 你能解释一下吗?我不明白 pt 和 ot 是干什么用的。
  • 对不起,它们只是表的别名,所以我不必输入完整的表名,以下也应该工作 SELECT * FROM product_table LEFT JOIN order_table ON order_table.product_id=product_table.id WHERE product_table .id = 1
  • +1:如果 where 子句出现在 join 之后,则 OP 的第一个查询是正确的。
  • pt 和 ot 是表的别名,在查询中使用别名对于降低表名的复杂度非常有用。
【解决方案2】:

你应该像这样重写你的查询:=

SELECT * FROM product_table
LEFT JOIN order_table
ON order_table.product_id=product_table.id
AND product_table.id=1
where product_table.id=1

如果你不使用 where 子句,那么所有记录都是从你的 product_table 中获取的,匹配条件放在 on 子句中。

【讨论】:

    【解决方案3】:

    如果您仔细查看SELECT 的语法,您会发现WHERE 子句必须在JOIN 子句之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 2016-06-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多