0

我在一项作业中遇到了一个问题,我花了超过 40 个小时试图解决这个问题。将两个表连接在一起时,我得到了正确的答案,但是当我添加第三个时 - 我丢失了一行并且计数不正确。

这会找到正确的答案:

use prime_minister_2013;
select ministry.pm_name, count(*) AS Number_times_PM, ministry.min_begin, ministry.party,deputy_pm.deputy_name
from ministry, deputy_pm
where deputy_pm.min_nr = ministry.min_nr
and ministry.party <> 'ALP'
and min_begin < '1930-01-01'
group by ministry.pm_name;

but when I try to add the third table containing who was the Governor General when they are elected it loses one of the rows (a PM) and the count on 2 of the rows doubles.

我假设我的连接/& 或分组不正确!

use prime_minister_2013;
select ministry.pm_name, count(*) AS Number_times_PM, ministry.min_begin, ministry.party,deputy_pm.deputy_name, gg_title, gg_name
from ministry
join deputy_pm
on deputy_pm.min_nr = ministry.min_nr
join governor_general
on governor_general.pm_name = ministry.pm_name 
and ministry.party <> 'ALP'
and min_begin < '1930-01-01'
group by ministry.pm_name;

非常感谢任何建议 - 25/9/13 到期


谢谢大家的评论 - 请在下面找到表格示例:

表:事工

min_nr  pm_name party   min _begin
1   Barton E    Protectionist   1/01/1901
15  Bruce S M   Nationalist 9/02/1923
27  Chifley J B ALP 13/07/1945
28  Chifley J B ALP 1/11/1946
9   Cook J  Liberal 24/06/1913
24  Curtin J J A    ALP 7/10/1941
25  Curtin J J A    ALP 21/09/1943

表:副总理

min_nr  deputy _ name   party
1   Deakin A    Protectionist
2   Lyne W J    Protectionist
3   Hughes W M  ALP
4   McLean A    Protectionist
5   Isaacs I A  Protectionist
6   Hughes W M  ALP
7   Cook J  Free Trade
8   Hughes W M  ALP
9   Forrest J   Liberal

表:总督

GG_name GG_title    GG _begin   GG _end pm_name
Hope J A L  7th Earl of Hopetoun    1/01/1901   9/01/1903   Barton E
Tennyson H  2nd Baron Tennyson  9/01/1903   21/01/1904  Barton E
Northcote H S   Baron Northcote 21/01/1904  9/09/1908   Deakin A
Ward W H    2nd Earl of Dudley  9/09/1908   31/07/1911  Deakin A
Denman T    3rd Baron Denman    31/07/1911  18/05/1914  Fisher A
Munro Ferguson, R C Rt Hon Sir  18/05/1914  6/10/1920   Cook J
Forster H W Baron Forster   6/10/1920   8/10/1925   Hughes W M
Baird J L   Baron Stonehaven    8/10/1925   22/01/1931  Bruce S M
Isaacs I A  Rt Hon Sir  22/01/1931  23/01/1936  Scullin J H
Hore-Ruthven A G A  Brig. Gen, Baron Gowrie 23/01/1936  30/01/1945  Lyons J A
Gloucester H W F A  HRH Prince, Duke of Gloucester  30/01/1945  11/03/1947  Curtin J J A

为了回应 Space Dogs 的建议 - 我尝试了这个:

use prime_minister_2013;
select ministry.pm_name AS 'PM Name', DATE_FORMAT (ministry.min_begin,'%Y') As 'Ministry Started', ministry.party AS 'Party', deputy_pm.deputy_name AS 'Deputy PM Name', COUNT(DISTINCT ministry.min_begin) AS 'Number of times PM',  gg_title AS 'GG Title', gg_name AS 'GG Name'
from ministry
join deputy_pm
on deputy_pm.min_nr = ministry.min_nr
join governor_general
on governor_general.pm_name = ministry.pm_name 
and ministry.party <> 'ALP'
and min_begin < '1930-01-01'
group by ministry.pm_name;

这给了我:

Barton E    1901    Protectionist   Deakin A    1   2nd Baron Tennyson  Tennyson H
Bruce S M   1923    Nationalist Page  C G   1   Baron Stonehaven    Baird J L
Cook J  1913    Liberal Forrest J   1   Rt Hon Sir  Munro Ferguson, R C
Deakin A    1909    Protectionist   Cook J  3   Baron Northcote Northcote H S
Hughes W M  1916    National Labor  Pearce G F  3   Baron Forster   Forster H W

即将到达那里 - 但仍然缺少没有 GG 的 PM

4

1 回答 1

0

没有看到数据就很难提供帮助,但是您寻求建议,所以这就是我要做的。

首先,检查数据——你说有些行消失了,而其他行的计数是双打的——这意味着对于某些 PM,数据中没有总督,而对于其他人,则有两个。您应该尝试更简单的查询,只需选择一些东西(无组或 COUNT 函数)分别连接两个表中的每一个,这样您就可以理解数据。

你正在做一个INNER JOINJOIN相当于在 mysql,IIRC 中)。因此,您只会得到双方都匹配的结果,如果缺少州长,那么您将失去该行,所以要尝试的一件事是LEFT JOIN- 先尝试一些简单的事情:

USE prime_minister_2013;
SELECT ministry.pm_name, gg_name
FROM ministry
LEFT JOIN governor_general
ON governor_general.pm_name = ministry.pm_name ; 

看看你会得到什么(如果 gg_name 连续出现空白,请再试一次,只是JOIN为了看到该行消失)。您还将查看是否有具有两个 GG 的 PM。

从那里开始,这取决于您实际想要获得的结果 - 为了使计数正确,您可能想要做COUNT(DISTINCT ministry.min_begin)而不是COUNT(*). 第一个将计算事工开始的不同次数(这将是该人担任 PM 的次数或时间),而不是匹配的行数。

还有一些其他的事情需要考虑——在你的查询中你只按一行分组,然后你选择的其他字段(ministry.min_begin等)将(再次,如果我没记错的话)从匹配的行中随机抽取——这可能不是你想要的。所以你可能要考虑MIN(ministry.min_begin)等。

最后,再次取决于您的数据,也许数据正在存储事情发生变化的日期 - 例如,如果 PM 发生变化但 GG 保持不变,您可能有几行 PM 行,但只有一个 GG 行覆盖所有行(如果这是一个澳大利亚问题,我认为肯定是这样)。在这种情况下,您将需要在日期的交叉点上执行 JOIN。

但是,我认为这应该让你开始,你可以更新这个问题 - 或者如果你必须尝试匹配日期,你可以搜索其他答案,或者提出一个单独的问题(顺便说一句,这个答案看起来很有希望:MySQL -发现时间重叠)。

祝你好运。

编辑

我不能从这里测试这个,但使用LEFT JOIN会找回你的旧行,但我认为你需要更聪明。如果您需要每个 PM 的 GG,那么您不能仅加入表格pm_name(因为这只是 GG 开始时的 PM 名称)。这实际上取决于您需要的实际数据是什么,要做的一件事是:

USE prime_minister_2013;
SELECT  ministry.pm_name, count(*) AS Number_times_PM, GG_name
  FROM ministry
  JOIN deputy_pm
    ON deputy_pm.min_nr = ministry.min_nr
  LEFT JOIN governor_general
    ON governor_general.GG_begin <= min_begin AND governor_general.GG_end >= min_begin
   AND ministry.party <> 'ALP'
   AND min_begin < '1930-01-01'
 GROUP by ministry.pm_name, GG_name;

但我认为你的数据是故意变得困难的,所以这真的取决于你想要找到什么。您可能需要执行两个查询(或一个带有子查询的查询),因为您可能想知道在单独的术语下具有多个 GG 的 PM。

但是如果你玩上面的东西,你可能会有所收获。

于 2013-09-22T06:19:01.140 回答