2014-09-24 30 views
0
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这有什么错我的SQL COUNT条

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

governor_general表

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

你可以展示一些样本来自'governor_general'的数据 – Jens 2014-09-24 05:43:14

+1

尝试'COUNT(DISTINCT ministry.pm_name)' – 2014-09-24 05:43:16

+0

该死的错误地方请忽略 – 2014-09-24 06:01:59

回答

0

的问题是从一个joins未来 - 它必须包含1-n的关系,并且可以返回多个行。所以当你计算pm_names时,它会复制一些条目。

要删除这些重复项,请使用DISTINCTCOUNT

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

但是,根据您的预期结果,您可能需要决定哪些记录是正确的返回。 Mysql对它的使用GROUP BY有点宽容,这也许就是你为什么要返回重复计数的原因。

+0

DISTINCT删除重复项。即使他们不止一次当选,部长名单也会选出所有总理。因此,要计算他们在1930年之前选举了多少次,DISTINCT只会为所有PM选出1次 – James 2014-09-24 05:52:30

+0

@詹姆斯 - 你真正的问题在你的“组合”中。你真的应该在你的'select'语句中把所有的字段'分组'。这将帮助您找出重复数据的位置。 'Mysql'是唯一的RDBMS系统之一,它允许这个不恰当的'group by'子句,导致随机结果。 – sgeddes 2014-09-24 05:56:58

0

只有当每个有选举一个记录在该部表是这是否可行:

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

因为有可能是通过组合你会得到一个1到n问题的表数每民选政府时期GG的。使用PM的名字不会有帮助,因为一个PM可以跨越多次选举,所以我认为你必须使用ID来统计不同部门记录的数量(或者是该表的唯一身份)