【问题标题】:Inner Join and Outer Joins Producing the same Result内连接和外连接产生相同的结果
【发布时间】:2012-05-28 00:24:41
【问题描述】:

我在 Mysql 中有 2 个表,一个是承包商,另一个是项目,我想生成一个承包商项目报告,显示项目的批准。问题是 INNER JOIN、LEFT 和 RIGHT OUTER JOIN,都产生相同的结果,即使我忽略了看起来很奇怪的情况,也只会显示承包商的项目。这是我的陈述

SELECT DISTINCT (tbl_contractor.name_v), count( tbl_project.name_v ) 
FROM tbl_contractor 
INNER JOIN tbl_project 
  ON tbl_project.Contractor=tbl_contractor.contractor_id_v 
  ON tbl_project.Contractor = tbl_contractor.contractor_id_v 
LIMIT 0 , 30;

SELECT DISTINCT (tbl_contractor.name_v), count( tbl_project.name_v ) 
FROM tbl_contractor
LEFT OUTER JOIN tbl_project 
ON tbl_project.Contractor = tbl_contractor.contractor_id_v 
LIMIT 0 , 30;

【问题讨论】:

  • 尝试从您的查询中删除 distinct。
  • stackoverflow.com/questions/38549/… 该链接应该有助于解释。基本上,您的内部联接采用相交字段,而您的外部联接显示左侧的所有字段匹配它们不相交的空值。假设两个表完全匹配,它们将提供相同的数据。
  • 建议:在您的查询中添加一个 group by 以阐明它在做什么。

标签: php mysql sql


【解决方案1】:

您有一个聚合函数COUNT(),但没有GROUP BY。这意味着您的查询将只返回一行。

您可能需要GROUP BY(承包商):

SELECT tbl_contractor.name_v, COUNT( tbl_project.name_v ) 
FROM tbl_contractor
  LEFT OUTER JOIN tbl_project 
    ON tbl_project.Contractor = tbl_contractor.contractor_id_v 
GROUP BY tbl_contractor.contractor_id_v 
LIMIT 0 , 30;

【讨论】:

  • 您知道,到目前为止,我一直误读文档:我一直将文档阅读为在未提供 GROUP BY 时隐式添加。相反,正如您所说:从概念上讲,原始意味着 SELECT ANY(tbl_contractor.name_v), COUNT(tbl_project.name_v) - 如果 MySQL 实际上提供了 ANY 作为聚合函数而不是隐式执行此操作,那么它会少很多混乱。
  • 是的,其他 DBMS 会在这样的查询上抛出错误。 MySQL 盲目地假设一个人知道自己在做什么并返回一些答案(在这种情况下,随机数据在列tbl_contractor.name_v
【解决方案2】:

通过SELECT DISTINCT (tbl_contractor.name_v),查询将只为每个承包商名称返回一行,尝试删除不同的并查看是否获得更好的承包商 - 项目结果。

【讨论】:

    【解决方案3】:

    这些查询实际上是按对承包商的查询分组的。如果每个承包商至少有一个项目,那么内连接和左外连接将返回相同的结果。如果有承包商没有项目,那么结果会受到 LIMIT 条款的影响。您只能获得前 30 个,而且无论出于何种原因,匹配项都会首先出现。

    【讨论】:

      猜你喜欢
      • 2013-04-12
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 2014-11-11
      • 2014-12-18
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多