我的SQL COUNT条款有什么问题

时间:2014-09-24 05:40:24

标签: mysql sql join count inner-join

use prime_minister_2013;

SELECT ministry.pm_name as 'PM Name', 
   ministry.min_begin as 'Commencement Date', 
   ministry.party as 'Party', 
   deputy_pm.deputy_name as 'Deputy Name', 
   governor_general.GG_title as 'Governor General Title',
   governor_general.GG_name as 'Governor General Name',
   COUNT(ministry.pm_name) as 'Times Elected'
   FROM ministry
     INNER JOIN deputy_pm ON ministry.min_nr=deputy_pm.min_nr
     INNER JOIN governor_general on ministry.pm_name=governor_general.pm_name
WHERE ministry.party NOT LIKE '%ALP%' AND ministry.min_begin < '1930%'
GROUP BY ministry.pm_name
ORDER BY ministry.min_begin;

结果表格显示,当他们的名字显示在ministry表和governor_general表中时,总理候选人数的两倍。 但是,COUNT子句仅限于从“部长表”中计算pm_name

INNER JOIN被带走时,计数是正确的。 我的查询出了什么问题?

governor_general table

+--------------+----------------+----------+----------+---------+
|GG_name       |GG_Title        |GG_begin  |GG_end    |pm_name  |
+--------------+----------------+----------+----------+---------+
|Baird J L     |Baron Stonehaven|1925-10-08|1931-01-22|Bruce S M|
+--------------+----------------+----------+----------+---------+

2 个答案:

答案 0 :(得分:0)

问题来自joins之一 - 它必须包含1-n关系并返回多行。因此,当您计算pm_names时,它会复制一些条目。

要删除这些重复项,可以选择DISTINCTCOUNT一起使用。

SELECT ...,
    COUNT(DISTINCT ministry.pm_name) as 'Times Elected'
...

但是,根据您所需的结果,您可能需要确定哪些记录是正确的记录。使用GROUP BY时,Mysql更宽容一些,这也许就是你返回重复计数的原因。

答案 1 :(得分:0)

只有在部委表格中每次选举都有一条记录才可行:

SELECT ...,
    COUNT(DISTINCT ministry.unique_identifier_field_here) as 'Times Elected'
...

由于每个选举产生的政府时期可能会有几个GG,因此你会得到1到n的问题。使用PM的名字不会有帮助,因为一个PM可以跨越许多选举,所以我认为你必须使用ID(或任何是该表的唯一标识)计算不同数量的事工记录