【问题标题】:Join conditions ON vs WHERE加入条件 ON vs WHERE
【发布时间】:2016-11-07 10:32:12
【问题描述】:

可能是一个愚蠢的问题,但是为什么这两个 mysql 查询给出不同的结果?

select * from table1 p join table2 m on p.mid=m.mid and m.onw=1

select * from table1 p join table2 m on p.mid=m.mid where m.onw=1

前者提供了大约 5 倍的行数。 “and m.onw=1”不是和后面查询中的“where”子句一样限制吗?

从 phpmyadmin 执行的实际实时查询是:

select * from xcart_products p join xcart_manufacturers m on p.manufacturerid=m.manufacturerid and m.onwalmart=1 
 (197023 total)

select * from xcart_products p join xcart_manufacturers m on p.manufacturerid=m.manufacturerid where m.onwalmart=1 
(38996 total)

更新。似乎是 phpmyadmin 中的一个错误。如果我使用 count(*) 而不是 * 那么结果是相同的。也许 count(*) 会导致返回的行数减少?

【问题讨论】:

  • 我不希望 INNER JOIN 的输出有差异,我相信 MySql 中的默认 JOIN 是 INNER JOIN。但是,LEFT JOIN 会有所不同。

标签: mysql join where-clause


【解决方案1】:

是的,无论您将过滤器放在哪里,它都应该提供相同数量的行。

第一个查询:它将连接2个表并过滤m.onw=1

第二次查询: 它将加入 2 个表,然后过滤 m.onw=1

【讨论】:

  • 但它没有。我更新了我正在使用的确切查询
  • 如果您只过滤 onw=1,只需一个问题。你会得到多少记录?我想这就是你的答案。
  • 我过滤了两种方式。似乎如果我使用 count(*) 而不是 * 那么结果是相同的。知道为什么吗?
  • 你能指定像 m.* 和 , p.* 并检查你会得到多少行>
  • p.* 给出 197k 行。 p.*,m.* 给出 39k 行。
【解决方案2】:

最好将其添加到join语句中,而不是将其添加为where子句,从性能角度来看会更好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2010-11-04
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多