Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: групировка с подсчетом
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
упрощенно имеем таблицу
id, type, count
нужно узнать для каждого id сумму count по каждому типу
типа
id =1, type=2, SUM(count) = 5
id =1, type=1, SUM(count) = 1
id =1, type=3, SUM(count) = 2
id =2, type=1, SUM(count) = 1
так можно закрутить на mysql?
Мелкий
Отправлено: 01 Ноября, 2012 - 17:27:46
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Записывать колонки как номера я бы не рекомендовал по причине того, что если запрос:
0. достаточно объемный
1. генерируется динамически, особенно через ORM
- получится затруднительное чтение подобных конструкций в будущем (придется постоянно держать в голове порядок следования колонок)
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DlTA
Отправлено: 01 Ноября, 2012 - 18:57:58
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
немного я промахнулся с задачей
результат желательно в вот таком виде
id =1, SUM(count if(type=1)) = 5, SUM(count if(type=2)) = 10
id =2, SUM(count if(type=1)) = 2, SUM(count if(type=2)) = 1
id =3, SUM(count if(type=1)) = 6, SUM(count if(type=2)) = 21
при этом типов там может быть только 2
ну или чтоб уж до конца быть честным мне нужно выцепить id у которых есть че та там с type=1 но при этом для type=2 будет 0
EuGen
Отправлено: 01 Ноября, 2012 - 20:00:55
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
SELECT left_table.id, left_table.total AS sum_count_type_1, right_table.total AS sum_count_type FROM(SELECT id, SUM(count)AS total FROM table_name WHERE type=1 GROUPBY id)AS left_table LEFTJOIN(SELECT id, SUM(count)AS total FROM table_name WHERE type=2 GROUPBY id)AS right_table ON left_table.id=right_table.id
SELECT id FROM(SELECT left_table.id, left_table.total AS sum_count_type_1, right_table.total AS sum_count_type=2 FROM(SELECT id, SUM(count)AS total FROM table_name WHERE type=1 GROUPBY id)AS left_table LEFTJOIN(SELECT id, SUM(count)AS total FROM table_name WHERE type=2 GROUPBY id)AS right_table ON left_table.id=right_table.id)AS plain_table WHERE plain_table.sum_count_type_1>0 AND plain_table.sum_count_type_2=0
?
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DlTA
Отправлено: 01 Ноября, 2012 - 20:42:29
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
тоесть без двойной выборки никак?
EuGen
Отправлено: 01 Ноября, 2012 - 20:47:56
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Здесь все не так плохо - все же не DEPENDED SUBQUERY получится. Правда соединение явно не будет использовать индексов, так как таблицы временные.
Но, если я корректно понял условие, думаю, через SQL в любом случае в JOIN будет.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DlTA
Отправлено: 01 Ноября, 2012 - 21:21:14
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
в общем не так все плохо как я ожидал хотя о запросах на 2 разворота до этого думал как о чем то утопическом)
+
то есть изначальная выборка в впихивается в таблицу `tt02`, в данном случае это упрощенная выборка, но в реале это пересечения 5-6 таблиц и т.д
а далее хотелось уже использовать эту `tt02` для получения разнообразных данных по типу того что было выше, но мускуль не позволяет так делать ( том формате запроса который привел я) говоря что в базе нет таблицы `tt02`,
тоесть
...
() as `tt02`
JOIN (выборка на основе `tt02`) ... // вот тут ругается
...
неужели в мускуле нет возможности сформировать сформировать некую таблицу которая потом будет использована во вложенных запросах?
EuGen
Отправлено: 02 Ноября, 2012 - 13:53:30
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DlTA
Отправлено: 02 Ноября, 2012 - 14:25:30
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
а по сравнению с двойной выборкой создание временной таблицы проигрывает в скорости или объеме используемой памяти?
EuGen
Отправлено: 02 Ноября, 2012 - 14:34:39
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
На самом деле создание временной таблицы, это из разряда вариантов "хуже некуда". В большинстве случаев. С другой стороны, через обычный SQL решение будет потреблять примерно такие же ресурсы за минусом накладных ресурсов на создание временной таблицы.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.