Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подсчет в самой таблице больше/меньше значении с COUNT-ом / 3 сообщений из 3, страница 1 из 1
25.09.2015, 19:14:30
    #39061592
Avtopic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет в самой таблице больше/меньше значении с COUNT-ом
Здравствуйте!

Давно этим не занимался и голова лопнет, целый день над этим запросом мучаюсь.

имею такую таблицу (ну, пример чуть-чуть упрощен): ид страницы, тип страницы, количество click-ов

page_id page_type click_count11112 43313110 00361 9 87571 9 60281 9 87513211 254101 8 0361211 112

группировка происходит по типу страниц. Нужно в группе вычислить сколько страниц имеют больше click-ов,
сколько страниц имеют меньше, и сколько страниц имеют ровное количество и приписать к соответствующему page_id.

page_id page_type click_count count_worse count_better count_equal11112 43350013110 00341061 9 87522171 9 60215081 9 87522113211 254100101 8 0360501211 112010
(например, страница с page_id 6 и 8 имеют каждый : по одной странице у которого тоже самое количество click-ов,
оба имеют две страницы у которых больше click-ов, и оба имеют две страницы у которых меньше click-ов)


Написал запрос который делает это дело но написал тупо, запрос медленный, потому что использует 4 temporary таблиц и 4 filesort

Код: sql
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.
SELECT pfb.page_id, IFNULL(pfb1.count - 1,0) as count_equal, 
                    IFNULL(pfb2.count,0) as count_better, 
                    IFNULL(pfb3.count,0) as count_worse 
                    FROM osc_products_facebook pfb 

LEFT JOIN
(
  SELECT COUNT(*) as count, page_id, page_group FROM 
    (SELECT pfb.page_id, pfb.page_group from osc_products_facebook pfb 
    LEFT JOIN osc_products_facebook pfb2 ON pfb.click_count = pfb2.click_count
    where not isnull(pfb2.page_id)) pfb2
      group by page_id, page_group
)pfb1
ON pfb.page_id = pfb1.page_id and pfb.page_group = pfb1.page_group

 LEFT JOIN
(
  SELECT COUNT(*) as count, page_id, page_group FROM 
    (SELECT pfb.page_id, pfb.page_group from osc_products_facebook pfb 
    LEFT JOIN osc_products_facebook pfb2 ON pfb.click_count < pfb2.click_count
    where not isnull(pfb2.page_id)) pfb2
      group by page_id, page_group
)pfb2 
ON pfb.page_id = pfb2.page_id and pfb.page_group = pfb2.page_group

 LEFT JOIN
(
  SELECT COUNT(*) as count, page_id, page_group FROM 
    (SELECT pfb.page_id, pfb.page_group from osc_products_facebook pfb 
    LEFT JOIN osc_products_facebook pfb2 ON pfb.click_count > pfb2.click_count
    where not isnull(pfb2.page_id)) pfb2
      group by page_id, page_group
)pfb3
ON pfb.page_id = pfb3.page_id and pfb.page_group = pfb3.page_group

order by count_better



Посоветуйте как можно уменьшить эти 4 temporary таблиц и 4 filesort во время выполнения запроса
Т.е. как можно это сделать запросом, по лучше

Спасибо!
...
Рейтинг: 0 / 0
25.09.2015, 20:13:26
    #39061627
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет в самой таблице больше/меньше значении с COUNT-ом
Код: sql
1.
2.
3.
4.
5.
6.
select id, @gr := gr, @c := click
    , (select count(*) from t where gr = @gr && click < @c) less 
    , (select count(*) from t where gr = @gr && click > @c) more
    , (select count(*) from t where gr = @gr && click = @c) same
    from t
    group by id, gr
...
Рейтинг: 0 / 0
25.09.2015, 20:46:33
    #39061655
Avtopic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет в самой таблице больше/меньше значении с COUNT-ом
Lumix ,

Блеск ..!!!

В реальном варианте у меня UPDATE этой таблицы результатами этой выборки.
За-JOIN-ил в UPDATE запросе с самой таблицей и работает отлично.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
UPDATE osc_products_facebook pfb
LEFT JOIN
(
select page_id, @gr := page_group as page_group, @c := click_count
    , (select count(*) from osc_products_facebook where page_group = @gr && click_count < @c) worse_pages 
    , (select count(*) from osc_products_facebook where page_group = @gr && click_count > @c) better_pages
    , (select count(*) from osc_products_facebook where page_group = @gr && click_count = @c) equal_pages
    from osc_products_facebook 
    group by page_id, page_group
)pfb1
ON pfb.page_id = pfb1.page_id and  pfb.page_group = pfb1.page_group
SET pfb.better_pages=pfb1.better_pages, pfb.worse_pages=pfb1.worse_pages, pfb.equal_pages=pfb1.equal_pages



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


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