У меня есть два запроса SQL.
В одном я ищу, сколько городов в каждой стране, и отфильтрую все города с менее чем 6 городами.
Во втором я ищу, сколько населения в столице, и отфильтровываю всех, в которых проживает менее 500 000 жителей.
Результат, который я ищу, - это поиск по всем странам с более чем 6 городами в базе данных и менее чем 500 000 жителей, потому что они разных размеров, и я не могу их объединить
select c.name, count(ci.name) as states_in_country
from country c, city ci
where c.code=ci.country
group by c.name
having count(ci.name)>5
;
select c.name, c.capital, ci.population
from country c, city ci
where c.capital=ci.name and ci.population>500000
;
Я хотел сделать это в одном и том же
select c.name, count(ci.name) as states_in_country, ci.population
from country c, city ci
where c.code=ci.country and c.capital=ci.name
group by c.name
having count(ci.name)>5
;
Но это показывает счетчик для городов как один. столица.
Спасибо
Вот запрос, который может работать. Обратите внимание на тот факт, что вы упоминаете, что численность населения меньше, и вы используете в своем запросе > 500000
что больше, чем. Поэтому убедитесь, что вам нужно меньше.
select c.name,
cyCapital.name as capital,
cyCapital.population as capPop,
count(cy.*) cities
from country c
inner join city cy
on c.code = cy.country
and cy.population < 500000
left join city cyCapital
on c.code = cyCapital.country
and c.capital = cyCapital.name
group by c.name,
cyCapital.name as capital,
cyCapital.population as capPop
having count(cy.*) > 5
Похоже, что вы ищите не в запросе, который вы пытались
select c.name
from country
where c.name NOT IN (
select c.name
from country c
INNER JOIN city ci ON c.code=ci.country
group by c.name
having count(ci.name)>5
;
)
and NOT IN (
select c.name
from country c
INNER JOIN city ci ON c.capital=ci.name and ci.population>500000
)
Страны с более чем шестью городами и населением менее 500 000 человек:
select country
from city
group by country
having count(*) > 6 and sum(population) < 500000;
Страны с более чем шестью городами и хотя бы одним из них с населением менее 500 000 человек:
select country
from city
group by country
having count(*) > 6
and count(case when population < 500000 then 1 end) > 0;
Страны с более чем шестью городами, и все они с населением менее 500 000 человек:
select country
from city
group by country
having count(*) > 6
and count(case when population >= 500000 then 1 end) = 0;
Страны с более чем шестью городами и столицей с населением менее 500 000 человек:
select c.code
from country c on ci.country = c.code
join city ci
group by c.code
having count(*) > 6
and count(case when c.capital = ci.name and ci.population < 500000 then 1 end) = 1;
Ну, вы поняли...
Объединение должно сделать работу:
SELECT
c.name,
count(ci.name AS cities_in_country),
c.capital,
ci.population
FROM country
LEFT JOIN city ON c.code = ci.country
WHERE ci.population > 500000
HAVING COUNT(ci.name) > 5;
ON
, а не в WHERE
. (Ваше WHERE
делает ваше внешнее объединение простым внутренним соединением, потому что записи с внешним соединением имеют нулевое заполнение.)