Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Вывести кол-во 5 популярных + добавить "Остальное"


Автор: JEEN 11.12.2015, 19:07
Добрый вечер, подскажите, пожалуйста, как изменить запрос, чтобы он выводил следующее:

Цитата

20 - Москва
10 - СПб 
5 - Екатеринбург
5 - Другое 


"Другое" - это количество клиентов из городов, не вошедших в ТОП3.

Таблицы:
- clients (id, city_id) - Клиенты
- cities (id, name) - Города

Сделал вот такой запрос, но в "Другое" он заносит количество клиентов из всех городов, не исключая те, что вошли в ТОП3
Код

(SELECT 
      count(city_id) as city_count, 
      cities.name as city_name
FROM clients
INNER JOIN cities ON clients.city_id = cities.id
GROUP BY city_id
ORDER BY city_count DESC
LIMIT 3)

UNION

(SELECT 
      count(city_id) as city_count,
      "Другое" as city_name
FROM clients)


Во второй запрос хотел добавить WHERE city_id NOT IN (...упрощенный_первый_запрос...), но он ругается на LIMIT 3, говорит, что в MySQL нельзя в подзапросах писать LIMIT

Автор: Akina 11.12.2015, 19:24
Цитата(JEEN @  11.12.2015,  20:07 Найти цитируемый пост)
ругается на LIMIT 3, говорит, что в MySQL нельзя в подзапросах писать LIMIT

В подзапросах нельзя, а вот в представлениях - можно!


Автор: JEEN 11.12.2015, 23:32
Цитата
В подзапросах нельзя, а вот в представлениях - можно!

Спасибо за наводку, но не смог с ними разобраться

Сделал так, вроде работает
Код

(SELECT 
      count(city_id) as city_count, 
      cities.name as city_name
FROM clients
INNER JOIN cities ON clients.city_id = cities.id
GROUP BY city_id
ORDER BY city_count DESC
LIMIT 3)

UNION

(SELECT 
      count(city_id) as city_count,
      "Другое" as city_name
FROM clients 
WHERE city_id IN (
      SELECT * 
      FROM (
            SELECT count(city_id) as city_count 
            FROM clients 
            WHERE city_id IS NOT NULL 
            GROUP BY city_id 
            ORDER BY city_count DESC 
            LIMIT 3
      ) as t
))

Автор: Akina 11.12.2015, 23:54
Цитата(JEEN @  12.12.2015,  00:32 Найти цитируемый пост)
не смог с ними разобраться

Не смог разобраться с CREATE VIEW?  smile 

Цитата(JEEN @  12.12.2015,  00:32 Найти цитируемый пост)
Сделал так

Жуть какая...
Кстати, если 3 и 4 записи имеют одинаковый COUNT(city_id) - твой запрос будет выдавать то одну из них в топе, то другую... 

Автор: JEEN 12.12.2015, 00:06
Цитата
Не смог разобраться с CREATE VIEW?  smile 

2 раза попробовал, не получилось, пошел в поисковик по запросу с ошибкой и нашел какое-то решение. Оно, кстати, не работает... С Create view сейчас разобрался, но мне не нравится, что 2 таблицы лишних появляются, пусть лучше будет хардкорд в запросе.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)