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|
+--------------+----------------+----------+----------+---------+
答案 0 :(得分:0)
问题来自joins
之一 - 它必须包含1-n关系并返回多行。因此,当您计算pm_names时,它会复制一些条目。
要删除这些重复项,可以选择DISTINCT
与COUNT
一起使用。
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(或任何是该表的唯一标识)计算不同数量的事工记录/ p>