Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подсчет записей и вывод макс. значения. / 12 сообщений из 12, страница 1 из 1
06.06.2014, 05:01:58
    #38663104
greenGreen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей и вывод макс. значения.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
 [code=plaintext]Здравствуйте уважаемые форумчане. Cтолкнулся с проблемой.

Имеется таблица sale.
Структура:
id - id продажи
id_shopper - id покупателя
id_goods - id товара

Задача: Вывести ID'ы покупателей, купивших больше всего товаров.

Выполняю следующий запрос:

select
  id_shopper, max(num_goods)
from
(
  select id_shopper,
     count(id_shopper) as num_goods 
  from
     sales
  group by id_shopper
) as tmp;

В итоге получаю вот такой результат:
+------------+----------------+
| id_shopper | max(num_goods) |
+------------+----------------+
|          1 |              7 |
+------------+----------------+

Он не корректен, так как вот такой запрос:
select
  id_shopper,
  count(id_goods)
from
  sales
group by
  id_shopper;

Возвращает следующее:
+------------+----------------+
| id_shopper | count(id_goods) |
+------------+----------------+
          1              4 
          2              4
          3              7
          4              7

По идее первый запрос должен был вернуть записи

id_shopper  count(id_goods)
          3              7
          4              7

Пожалуйста, помогите разобраться с проблемой.
Заранее спасибо.
...
Рейтинг: 0 / 0
06.06.2014, 07:00:27
    #38663120
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей и вывод макс. значения.
к сожалению (или к счастью), в mysql нет with ties, так что как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select 
  t1.id_shopper  
from 
(select 
  id_shopper ,count(idgood) c
from sales group by 1
) t1 join
(
 select  id_shopper, count(id_goods) c
 from sales
 group by 1
 order by 2 desc limit 1
) t2 on t1.c=t2.c
...
Рейтинг: 0 / 0
06.06.2014, 07:25:39
    #38663124
greenGreen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей и вывод макс. значения.
Ого 0_0. tanglir, большое Вам спасибо. Не ожидал, что придется так закрутить) Проблема в том, что в тестовой табличке 22 записи, а запрос отработал за 4 с. Попробую еще поискать альтернативные решения. Если попытка будет успешной, отпишу сюда.
Еще раз спасибо.
...
Рейтинг: 0 / 0
06.06.2014, 07:37:53
    #38663131
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей и вывод макс. значения.
greenGreenОго 0_0. tanglir, большое Вам спасибо. Не ожидал, что придется так закрутить) Проблема в том, что в тестовой табличке 22 записи, а запрос отработал за 4 с. Попробую еще поискать альтернативные решения. Если попытка будет успешной, отпишу сюда.
Еще раз спасибо.

интересно, можно ли написать

....
select max(count(id_goods)) c
from sales
group by id_shopper
......
...
Рейтинг: 0 / 0
06.06.2014, 07:38:33
    #38663132
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей и вывод макс. значения.
greenGreenПроблема в том, что в тестовой табличке 22 записи, а запрос отработал за 4 с.ну это точно не в запросе дело, на 22 записях любой подобный запрос должен отработать за миллисекунды
...
Рейтинг: 0 / 0
06.06.2014, 07:39:41
    #38663133
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей и вывод макс. значения.
javajdbc,

по-моему нет
да и зачем, ордербай + лимит 1 делает ровно то же самое
...
Рейтинг: 0 / 0
06.06.2014, 07:56:21
    #38663138
greenGreen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей и вывод макс. значения.
javajdbc,javajdbc интересно, можно ли написать

....
select max(count(id_goods)) c
from sales
group by id_shopper
......

Нет, выдает вот такое сообщение: Invalid use of group function
Версия MySQL: 5.6.19

tanglir,
tanglir ну это точно не в запросе дело, на 22 записях любой подобный запрос должен отработать за миллисекунды
Вы правы. Глюк был у меня. Сейчас добавил пару десятков записей и выполнил Ваш запрос. Все отработало очень быстро.
...
Рейтинг: 0 / 0
06.06.2014, 15:28:34
    #38663748
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей и вывод макс. значения.
tanglirк сожалению (или к счастью), в mysql нет with ties, так что как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select 
  t1.id_shopper  
from 
(select 
  id_shopper ,count(idgood) c
from sales group by 1
) t1 join
(
 select  id_shopper, count(id_goods) c
 from sales
 group by 1
 order by 2 desc limit 1
) t2 on t1.c=t2.c




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT id_shopper, total 

FROM (

    SELECT id_shopper,@m:=COUNT(idgood) AS 'total',IF(@k<@m,@k:=@m,@k)

    FROM sales join (SELECT @k:=0) k

    GROUP BY id_shopper

) t

WHERE

total = @k;


enjoy!
...
Рейтинг: 0 / 0
06.06.2014, 15:30:54
    #38663751
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей и вывод макс. значения.
если что, можно в фак добавить на тему использование переменных.
...
Рейтинг: 0 / 0
06.06.2014, 15:56:24
    #38663805
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей и вывод макс. значения.
alex564657498765453если что, можно в фак добавить на тему использование переменных.Напишите цельный пост с постановкой задачи и решением, а я его перенесу в тот топик.

И есть у меня ощущение, что так проще:
Код: sql
1.
SELECT id_shopper,@k:=GREATEST(@k,COUNT(idgood)) AS 'total'
...
Рейтинг: 0 / 0
06.06.2014, 16:17:42
    #38663850
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей и вывод макс. значения.
miksoftalex564657498765453если что, можно в фак добавить на тему использование переменных.Напишите цельный пост с постановкой задачи и решением, а я его перенесу в тот топик.

И есть у меня ощущение, что так проще:
Код: sql
1.
SELECT id_shopper,@k:=GREATEST(@k,COUNT(idgood)) AS 'total'



тада, компактней. но через иф изящней :)
ЗЫ
под изяществом понимаю использовать как можно меньше языковых конструкций, функций, и как болле простых/общеизвестных/наиболее употребимых/с боллее широкими возможностями
...
Рейтинг: 0 / 0
06.06.2014, 19:29:02
    #38664075
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет записей и вывод макс. значения.
alex564657498765453,

Перенес, орфографические ошибки в первом приближении исправил. Если нужно исправить что-то еще - пишите в "сообщить модератору" к тому посту.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подсчет записей и вывод макс. значения. / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]