Помогите составить 2 SQL-запроса

Есть таблица с тремя колонками:
КомпанияПокупательПродукт
Условия:
— один покупатель может быть соотнесен лишь с одной компанией
— У покупателя может быть несколько продуктов
— У компании может быть несколько покупателей
— связь компаний с продуктами не рассматривается
Соответственно записи выглядят примерно так:

company_1 | customer_1 | item_1
company_1 | customer_1 | item_2
company_1 | customer_1 | item_3
company_1 | customer_2 | item_2
company_2 | customer_3 | item_1
company_2 | customer_4 | item_3
company_2 | customer_3 | item_2

Задача:
1. построить ТОП-100 компаний по количеству покупателей, купивших более 10 разных продуктов.Записей в таблице до фига.
2. имея то или иное значение компании выяснить её место в этом рейтинге
  • Вопрос задан
  • 2859 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Vampiro
SELECT  `company` , customer, COUNT(  `item` ) AS items
FROM  `test` 
GROUP BY company
HAVING COUNT(  `item` ) >10
ORDER BY COUNT(  `customer` ) DESC 

Я бы выгружал это в отдельную табличку и там уже искал рейтинг нужной. Хотя можно потестить вычисляемое поле в этот запрос затискать.
Ответ написан
@balloon
-- checked on 4M rows

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `company` int(11) NOT NULL,
  `customer` int(11) NOT NULL,
  `item` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `search` (`company`,`customer`,`item`)
) ENGINE=MyISAM AUTO_INCREMENT=4000001 DEFAULT CHARSET=utf8;

-- 1) ~ 2.2sec
SELECT company, count(customer) as `customers_count`
FROM (SELECT customer, company FROM test GROUP BY customer HAVING COUNT(DISTINCT item) > 5) as `temp`
GROUP BY company
ORDER BY customers_count DESC
LIMIT 100

-- 2) ~2.2sec

SET @rank = 0;
SELECT rank, company FROM (
	SELECT @rank := @rank + 1 as `rank`, company FROM (
		SELECT company, count(customer) as `customers_count`
		FROM (SELECT customer, company FROM test GROUP BY customer HAVING COUNT(DISTINCT item) > 5) as `temp`
		GROUP BY company
		ORDER BY customers_count DESC
		LIMIT 100
	) as `temp2`
) as `temp3`
WHERE company = 159

Ответ написан
wartur
@wartur
Вам нужно активно пользоваться GROUP BY и DISTRINCT операторами. Чуть позже напишу более подробное решение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы