MySQL外连接和类似的表

时间:2011-12-15 07:49:26

标签: mysql sql

我有一张表,例如country_previous和另一个表country_current。两者结构相同,只有名称不同。请参阅下面的结构:

CREATE TABLE `country_previous` (
`name` varchar(70) NOT NULL DEFAULT '',
PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 MAX_ROWS=100000000 AVG_ROW_LENGTH=50

和另一个

CREATE TABLE `country_current` (
`name` varchar(70) NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |

正如名称所示,country_previous拥有所有国家/地区名称,比如一年前,而country_current现在拥有所有国家/地区。所以我希望获得在country_previous上次更新后创建的所有国家/地区。我试过这个查询, 但它有很多来自country_previous的条目。

SELECT count(*) FROM country_previous NATURAL RIGHT OUTER JOIN country_current WHERE   country_previous.name IS NULL;

这比预期的更多。例如:my country_previous有90个国家,country_current有110个国家。然后,我应该只获得自那时以来的新国家(country_previous的最后更新),即110 - 90 = 20.但我得到超过20个。

所以查询有什么问题,我该怎么办?

提前致谢。

PS:这个国家的想法只是一个真正帮助我让别人理解我真正需要的东西的例子,而我实际上并没有对国名做任何事情。

3 个答案:

答案 0 :(得分:2)

您可以尝试使用以下查询:

select count(*) from country_current cc
where cc.name not in (select cp.name from country_previous cp);

这将为您计算country_current中不在country_previous的所有国家/地区名称(我认为您的目标是什么?)。

或者,如果您想使用联接来执行此操作,那么您可以使用以下内容:

insert into country_current values ('USA');
insert into country_current values ('China');
insert into country_current values ('Russia');
insert into country_current values ('UK');
insert into country_current values ('France');

insert into country_previous values ('Russia');
insert into country_previous values ('UK');
insert into country_preivous values ('France');

然后运行:

select sum(case when cp.name is null then 1 else 0 end) as newCountries
from country_current cc
left outer join country_previous cp on cc.name = cp.name;

答案 1 :(得分:0)

如果国家/地区名称相似,则减号查询如下

SELECT count(*) from (    
SELECT cc.name from country_current cc
MINUS
SELECT cp.name from country_previous cp)

答案 2 :(得分:0)

查询返回意外结果,因为country_previous中可能存在某些country_previous中不存在的国家/地区。因此,当您进行验证country_previous.name IS NULL时,它不适用于这些记录。