MySQL Outer Join и похожие таблицы - PullRequest
       1

MySQL Outer Join и похожие таблицы

0 голосов
/ 15 декабря 2011

У меня есть таблица, скажем, 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;

Это дает больше, чем ожидалось. Например: у моей страны есть 90 стран, а у страны 110 стран. Затем я должен получить только новые страны с тех пор (последнее обновление country_previous), что равно 110 - 90 = 20. Но я получаю больше 20.

так что не так с запросом и что мне делать?

Заранее спасибо.

PS: эта идея о стране - просто пример, который действительно помогает мне заставить других понять, что мне действительно нужно, и на самом деле я ничего не делаю с названиями стран.

Ответы [ 3 ]

2 голосов
/ 15 декабря 2011

Вы можете попробовать использовать следующий запрос:

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;
0 голосов
/ 15 декабря 2011

Запрос возвращает неожиданные результаты, поскольку в стране country_previous могут быть некоторые страны, которых нет в таблице country_current. Таким образом, когда вы делаете проверку country_previous.name IS NULL, он не работает с этими записями.

0 голосов
/ 15 декабря 2011

Если названия стран похожи, то минус запрос выглядит следующим образом

SELECT count(*) from (    
SELECT cc.name from country_current cc
MINUS
SELECT cp.name from country_previous cp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...