Php 产生相同结果的内部联接和外部联接

Php 产生相同结果的内部联接和外部联接,php,mysql,sql,Php,Mysql,Sql,我在Mysql中有两个表,一个是holding contractors,另一个是holding Project,我想生成一份contractor Project报告,显示项目的批准情况。问题是内部连接,左侧和右侧外部连接,都会产生相同的结果,只显示承包商有一个项目,即使我忽略了看起来很奇怪的条件。这是我的声明 SELECT DISTINCT (tbl_contractor.name_v), count( tbl_project.name_v ) FROM tbl_contractor INN

我在Mysql中有两个表,一个是holding contractors,另一个是holding Project,我想生成一份contractor Project报告,显示项目的批准情况。问题是内部连接,左侧和右侧外部连接,都会产生相同的结果,只显示承包商有一个项目,即使我忽略了看起来很奇怪的条件。这是我的声明

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;

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

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

您有一个聚合函数,
COUNT()
,没有
分组依据。这意味着youir查询将只返回一行

您可能需要一个由
(承包商)组成的
小组:


尝试从查询中删除distinct。这种联系应该有助于解释。基本上,内部联接采用相交字段,而外部联接在左侧显示所有字段,这些字段与空值匹配,但不相交。假设两个表完全匹配,它们将提供相同的数据。建议:在查询中添加一个group by,以澄清它在做什么。您知道,到目前为止,我一直误读文档:我一直将文档理解为在未提供任何查询时隐式添加一个
group by
。相反,正如您所说:最初的意思是,从概念上讲,
选择任意(tbl_contractor.name_v),计数(tbl_project.name_v)
——如果MySQL实际上提供了
ANY
作为聚合函数,而不是隐式地这样做,那么就不会那么混乱了。是的,其他DBMS会在这样的查询中抛出错误。MySQL盲目地假设一个人知道自己在做什么,并返回一些答案(在本例中,随机数据位于
tbl\u contractor.name\u v
列)
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;