SQL вопрос о подсчете - PullRequest
       13

SQL вопрос о подсчете

0 голосов
/ 24 августа 2009

Я хочу сделать запрос, чтобы я мог получить только те местоположения, которые имеют не менее 50 мест.

У меня есть таблица мест:

Id, City, Country
1, Austin, USA
2, Paris, France

И таблица мест, подключенных к локациям по Location_id

Id, Name, Details, Location_id
1, The Zoo, blah, 2
2, Big Park, blah, 2

Я могу присоединиться к ним вот так:

ВЫБРАТЬ места.имя, места.ид, местоположения. Страна, местоположения.город С мест ВНУТРЕННИЕ СОЕДИНЕНИЯ ON place.location_id = location.id

как можно получить результаты только по городам, имеющим не менее 50 мест, и заказать их по наибольшему количеству?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 24 августа 2009

Используйте GROUP BY с предложением HAVING .

SELECT locations.country, locations.city, COUNT(*)
FROM places
     INNER JOIN locations ON places.location_id = locations.id
GROUP BY locations.country, locations.city
HAVING COUNT(*) >= 50
3 голосов
/ 24 августа 2009

ОК. Я видел, что приведенные выше ответы почти есть, но есть ошибки, поэтому просто выкладываю правильную версию:

SELECT locations.country, locations.city, COUNT(*) as count_of_places
FROM places
     INNER JOIN locations ON places.location_id = locations.id
GROUP BY locations.country, locations.city
HAVING COUNT(*) >= 50
ORDER BY count_of_places;
1 голос
/ 24 августа 2009

Вы можете использовать предложение having, чтобы ограничить эти строки значением статистического столбца. Кроме того, MySQL позволяет использовать ленивые group by s, поэтому вы можете абсолютно воспользоваться этим:

select
    l.country,
    l.city,
    p.name,
    p.details,
    count(*) as number_of_places
from
    locations l
    inner join places p on
        l.id = p.location_id
group by
    l.id
having
    count(*) >= 50
order by
    number_of_places,
    l.country,
    l.city,
    p.name
0 голосов
/ 24 августа 2009

В некоторой степени не работает, но должен работать:

SELECT places.name, places.id, sq.country, sq.city, sq.counter FROM (SELECT Locations.id, country,city, count(*) as counter FROM Locations JOIN Places ON (Locations.Id=Places.Location_id) GROUP BY location.id HAVING count (*)> = 50) AS sq ПРИСОЕДИНЯЙТЕСЬ К местам (sq.id = Places.Location_id) ЗАКАЗАТЬ ПО счетчику

P.S. Точный синтаксис может варьироваться в зависимости от базы данных, я не уверен, что это mysql -совместимый как есть.

...