2011-12-15 17 views
0

私はテーブル、例えば、country_previousと別のテーブルcountry_currentを持っています。どちらも構造は同じですが、名前だけが異なります。以下にそれらの構造を参照してください。MySQLの外部結合テーブルと同様のテーブル

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; 

これは、予想以上に多くなります。たとえば:私のcountry_previousには90カ国、country_currentには110カ国があります。それから、110-90 = 20の新しい国(country_previousの最後の更新)を取得する必要があります。しかし、私は20を超えます。

何が問題なのですか?

ありがとうございます。

PS:この国のアイデアは、実際に私が本当に必要としていることを他の人に理解させるのに役立ちます。実際に国名で何もしません。

+0

このテーブル構造ではこれを行うことはできません。 両方のテーブルの名前が異なるため、米国は米国と一致しないため、2つのテーブルを結合するポイントはありません。比較する他の列はありません。 – Zohaib

+0

Zohaib、以前は重要な点を追加していなかったことを申し訳なく思っています。私はちょうどそれで私のポストを更新しました。 PS:この国のアイデアは、本当に必要なものを他の人に理解させるのに役立ち、実際には国名を使って何もしません。 –

+1

また、名前プロパティを主キー/一意識別子として使用することは危険であると考えられます。名前にスペルミスがあり、それを変更した場合は、そのPK/IDも暗黙的に変更されています。そのPK/IDを参照するものはすべて更新する必要があります。自動インクリメントIDフィールドなどの代理キーを持つことで、nameプロパティの変更は、リレーショナル・インテグリティには影響しません。 – MatBailie

答えて

2

次のクエリを使用して試みることができる:

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

これは(私はあなたが後にあるかと思いいる?)あなたcountry_previousにないcountry_current内のすべての国の名前の数を与えます。実行し

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; 
+0

はいトム、私は同意します。しかし、私はどんな種類の結合条件でもそれを実行できるかどうかを知りたいと思います。 –

+1

OK。私はあなたが 'JOIN'を使いたかったことを知らなかった。私は、LEFT OUTER JOINを使って同じことをやり遂げる方法の例を追加しました。 –

+0

@TomMac - 'WHERE cp.name IS NULL'を追加して' SUM(CASE) 'を' COUNT(*) 'に置き換えることができました。正しい正解のために+1 – MatBailie

0

を国名が、その後マイナス類似している場合、あなたがこれを行うために結合を使用して空想ならば、あなたは、次のようなものを使用することができ

あるいは、クエリは次のようになります。

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

クエリは予期しない結果を返します。 country_currentテーブルに存在しないcountry_previousのountries。したがって、検証country_previous.nameがNULLの場合、これらのレコードでは機能しません。

関連する問題