Mysql 应该使用SQL联合还是联接?

Mysql 应该使用SQL联合还是联接?,mysql,sql,join,union,Mysql,Sql,Join,Union,我正在尝试获取我拥有的两张表的邮政编码和电话号码,病人和医生。我通过计算邮政编码得到了电话的数量,比如如果有5个病人的邮政编码是79555,那么这个数字就是5。如果patients表中有3人使用该邮政编码,而Medicines表中有4人使用该邮政编码,则应返回邮政编码和7。我试过下面的工会。乍一看,它似乎做了我想要的,但我想重复的邮政编码被总结,我可以在一个联盟中使用sum函数吗?还是必须创建联接 SELECT zip_code, COUNT(zip_code) AS Num_Patient_C

我正在尝试获取我拥有的两张表的邮政编码和电话号码,病人和医生。我通过计算邮政编码得到了电话的数量,比如如果有5个病人的邮政编码是79555,那么这个数字就是5。如果patients表中有3人使用该邮政编码,而Medicines表中有4人使用该邮政编码,则应返回邮政编码和7。我试过下面的工会。乍一看,它似乎做了我想要的,但我想重复的邮政编码被总结,我可以在一个联盟中使用sum函数吗?还是必须创建联接

SELECT zip_code, COUNT(zip_code) AS Num_Patient_Calls FROM patients GROUP BY zip_code
UNION ALL
SELECT zip_code, COUNT(zip_code) AS Num_Physician_Calls FROM physicians GROUP BY zip_code
编辑:解决方案 我使用Gordon和dweiss的响应来生成此SQL代码。它实现了我想要的功能,即从不相关的表中获取两个字段,这两个表可能具有相同的值,也可能不具有相同的值,计算每个表中具有该值的记录数,然后对两个表的结果求和。示例:患者表中邮政编码99709的6个实例,医生表中邮政编码99709的1个实例,显示的值为99709-7

SELECT zip_code, SUM(Patient_Calls) FROM (
    SELECT zip_code, COUNT(zip_code) AS Patient_Calls FROM patients GROUP BY zip_code
    UNION ALL
    SELECT zip_code, COUNT(zip_code) AS Physician_Calls FROM physicians GROUP BY zip_code
) AS new_table
GROUP BY zip_code ORDER BY `new_table`.`zip_code` 

由于这些是不相关的表,您需要使用
联合
。另外,
COUNT
SUM
是不同的函数,在本例中,您要查找的是
COUNT
。SUM将所有值相加,而
COUNT
将给出在
组中找到该行的次数。
像这样的怎么样

SELECT zip_code,COUNT(*) FROM (
SELECT zip_code AS Num_Patient_Calls FROM patients
UNION ALL
SELECT zip_code AS Num_Physician_Calls FROM physicians
) AS new_table
GROUP BY zip_code

由于这些是不相关的表,您需要使用
联合
。另外,
COUNT
SUM
是不同的函数,在本例中,您要查找的是
COUNT
。SUM将所有值相加,而
COUNT
将给出在
组中找到该行的次数。
像这样的怎么样

SELECT zip_code,COUNT(*) FROM (
SELECT zip_code AS Num_Patient_Calls FROM patients
UNION ALL
SELECT zip_code AS Num_Physician_Calls FROM physicians
) AS new_table
GROUP BY zip_code

为了回答您的问题,您需要一个
UNION ALL
FULL OUTER JOIN
,因为您可能只有一种呼叫类型的邮政编码

我将对结果进行如下安排:

select zip_code, sum(Patient_Call) as Num_Patient_Calls,
       sum(Physician_Call) as Num_Physician_Calls,
       sum(Patient_Call + Physician_Call) as Num_Calls
from 
(
  (SELECT zip_code, 1 AS Patient_Call, 0 as Physician_Call
   FROM patients
  )
  UNION ALL
  (SELECT zip_code, 0 AS Patient_Call, 1 as Physician_Call
   FROM physicians
  )
) calls
GROUP BY zip_code

如果要多次运行此查询,可以尝试在每个子查询中进行聚合,以查看聚合速度是否更快(例如,如果邮政编码上有索引,则可能更快)。

为了回答您的问题,您需要一个
联合所有
完全外部联接
,因为您可能只有一种呼叫类型的邮政编码

我将对结果进行如下安排:

select zip_code, sum(Patient_Call) as Num_Patient_Calls,
       sum(Physician_Call) as Num_Physician_Calls,
       sum(Patient_Call + Physician_Call) as Num_Calls
from 
(
  (SELECT zip_code, 1 AS Patient_Call, 0 as Physician_Call
   FROM patients
  )
  UNION ALL
  (SELECT zip_code, 0 AS Patient_Call, 1 as Physician_Call
   FROM physicians
  )
) calls
GROUP BY zip_code

如果您多次运行此查询,您可以在每个子查询中尝试聚合,以查看聚合是否更快(例如,如果邮政编码上有索引,那么它可能会更快)。

@dweiss,是否可以使用联合子选择上的和的示例来扩展答案?@astander您在我键入它时得到了我:)。我还继续解释了为什么你要计数而不是求和。这应该符合我的要求。让我确定我明白了。它对工会的行为就好像它是自己的桌子一样?基本上就像我对单个选择所做的那样,但是对于两个表中的数据,因为联合?有这样一个关于更高级SQL的好教程吗?很好。如果愿意,可以指定在子选择中使用DISTINCT而不是group by,或者在子选择中使用COUNT/group by,然后在外部选择中使用SUM。另外,请尝试照亮UNION和UNION ALL之间的差异看看下面的链接和@DWEIS,是否可以用UNION子选择上的一个和的例子来扩展答案?@astander你在我键入时得到了我:)。我还继续解释了为什么你要计数而不是求和。这应该符合我的要求。让我确定我明白了。它对工会的行为就好像它是自己的桌子一样?基本上就像我对单个选择所做的那样,但是对于两个表中的数据,因为联合?有这样一个关于更高级SQL的好教程吗?很好。如果愿意,可以指定在子选择中使用DISTINCT而不是group by,或者在子选择中使用COUNT/group by,然后在外部选择中使用SUM。另外,请尝试照亮UNION和UNION之间的差异。请查看以下链接,非常感谢您的输入!我没有使用你的准确回答,但你的回答确实让我找到了正确的答案,去做我想做的事!非常感谢您的投入!我没有使用你的准确回答,但你的回答确实让我找到了正确的答案,去做我想做的事!很高兴你找到了解决办法!我稍微改变了我的答案,它也应该起作用。这和你的解决方案有点不同,但我仍然是一个很好的解决方案。很高兴你找到了解决方案!我稍微改变了我的答案,它也应该起作用。这和你的解决方案有点不同,但我仍然是一个很好的解决方案。