Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подклейка суммы из разных таблиц / 25 сообщений из 41, страница 1 из 2
10.12.2013, 00:59:10
    #38494822
Dwr
Dwr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
Господа, помогите, пожалуйста, с нубской задачкой. Есть две условных таблицы, info и transactions:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE `info` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `unique_field` tinytext,
  `some_data` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

CREATE TABLE `transactions` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `unique_field` tinytext,
  `value` int,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;



В транзакции падает куча данных, с разным value и одинаковым unique_field. Мне нужно сложить все value в транзакциях и подклеить их к выборке из info по unique_field, попутно отсортировав вывод по убыванию SUM(value). Пробовал просто поочередно выбирать, но тогда у меня все значения value складываются :)
...
Рейтинг: 0 / 0
10.12.2013, 05:04:21
    #38494881
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
Dwr,

Код: sql
1.
2.
3.
4.
select info,sum(value)
from info i
join transactions t on i.unique_field=f.unique_field
group by 1 order by 2 desc
...
Рейтинг: 0 / 0
10.12.2013, 10:24:30
    #38495053
Dwr
Dwr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
tanglir,

да, что-то похожее я и сделал. Но тогда в sum(value) кладутся вообще все транзакции, а мне нужны только те, что с одинаковым unique_field. Условно наполнение такое:

Код: sql
1.
2.
INSERT INTO `info` (unique_field, some_data) VALUES ('some1', 'lalala'), ('some2', 'bebebe');
INSERT INTO `transactions` (unique_field, value) VALUES ('some1', 100), ('some1', 120), ('some1', 80), ('some2', 200)
...
Рейтинг: 0 / 0
10.12.2013, 10:34:39
    #38495067
Dwr
Dwr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
...а должен получить

Код: sql
1.
2.
some1 | lalala | 300
some2 | bebebe | 200
...
Рейтинг: 0 / 0
10.12.2013, 11:01:38
    #38495114
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
Dwrчто-то похожее я и сделал. Но тогда в sum(value) кладутся вообще все транзакцииЗначит, сделал совершенно непохожее. Будь внимательнее.
...
Рейтинг: 0 / 0
10.12.2013, 11:20:58
    #38495142
Dwr
Dwr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
Akina,

да я уже проверил и перепроверил несколько раз, все как по учебнику. А еще выбирается только первый unique_field, второй и последующие не выбираются. Может быть, проблема в одинаковых id?
...
Рейтинг: 0 / 0
10.12.2013, 11:24:06
    #38495150
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
Покажите свой запрос, что ли...
...
Рейтинг: 0 / 0
10.12.2013, 11:33:14
    #38495165
Dwr
Dwr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
Akina,

Код: sql
1.
2.
3.
select i.*,sum(value)
from info i
join transactions t on i.unique_field=t.unique_field
...
Рейтинг: 0 / 0
10.12.2013, 12:11:43
    #38495239
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
Ну! а я что говорю... Где в твоём запросе, жёваный крот, группировка? перепроверил он...
...
Рейтинг: 0 / 0
10.12.2013, 12:23:20
    #38495275
Dwr
Dwr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
Akina,

а-а-а!.. "Признаю свою вину, меру, силу, глубину".

/me стыдно очень-очень.

Спасибо всем за помощь!
...
Рейтинг: 0 / 0
10.12.2013, 12:24:15
    #38495280
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
Dwrда я уже проверил и перепроверил несколько раз, все как по учебнику. А еще выбирается только первый unique_field, второй и последующие не выбираются. Может быть, проблема в одинаковых id?
Неправильный учебник. Проблема в том, что вы неправильно делаете группировку. Подробнее см http://sqlinfo.ru/forum/viewtopic.php?id=6240

Окончательный запрос нужен вида
.. from info join (подзапрос с группировкой) ..
...
Рейтинг: 0 / 0
10.12.2013, 12:45:08
    #38495343
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
retvizanОкончательный запрос нужен вида
.. from info join (подзапрос с группировкой) ..А вот это уже с потолка взято.
...
Рейтинг: 0 / 0
10.12.2013, 13:11:13
    #38495419
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
AkinaretvizanОкончательный запрос нужен вида
.. from info join (подзапрос с группировкой) ..А вот это уже с потолка взято.
Почему?
Джойнить, а потом проводить группировку по текстовому полю первой таблицы - плохое решение с т.з. производительности.
...
Рейтинг: 0 / 0
10.12.2013, 13:59:09
    #38495547
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
retvizanПочему?
Джойнить, а потом проводить группировку по текстовому полю первой таблицы - плохое решение с т.з. производительности.
Ну например потому, что при объёмном результате подзапроса он будет закэшен на диск.
Или потому, что прощай использование индекса. Вернее, и.
В общем, оверхед запросто может стать пухлее профита. А на реальной базе указанного назначения - гарантированно станет.

Кроме того, если поле группировки есть уникальное поле левой таблицы - то чхать с высокой колокольни на неправильность запроса с точки зрения классического сиквела.

Кстати, с какого потолка взято, что группить он собрался по тексту?
...
Рейтинг: 0 / 0
10.12.2013, 17:36:44
    #38495942
Dwr
Dwr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
>> если поле группировки есть уникальное поле левой таблицы
Все верно, уникальное.

>> группить он собрался по тексту?
Да. Вернее, по число-буквенному коду.

Кстати, никто не подскажет, как подсчитать кол-во строк с таким запросом? А то мне почему-то кажется, что выбирать их все для такой задачи - моветон. Но COUNT() глупости какие-то показывает...
...
Рейтинг: 0 / 0
10.12.2013, 19:09:57
    #38496098
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
[quot DwrCOUNT() глупости какие-то показывает...[/quot]
COUNT(DISTINCT info.id)
...
Рейтинг: 0 / 0
10.12.2013, 19:36:35
    #38496124
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
AkinaНу например потому, что при объёмном результате подзапроса он будет закэшен на диск.Не понял смысла фразы. Речь о том, что размер временной таблицы столь велик, что не поместится в памяти?

AkinaИли потому, что прощай использование индекса. Вернее, и.Здесь и так связь таблиц не по индексу.
А если был бы индекс, то к данным подзапроса по индексу клеим данные из первой таблицы.
Кроме того в случае индекса группировка в подзапросе хорошо на него ляжет.

AkinaВ общем, оверхед запросто может стать пухлее профита. А на реальной базе указанного назначения - гарантированно станет.Прошу пояснений.

AkinaКроме того, если поле группировки есть уникальное поле левой таблицы - то чхать с высокой колокольни на неправильность запроса с точки зрения классического сиквела.

Кстати, с какого потолка взято, что группить он собрался по тексту?Согласен, что группировать по всем полям здесь не нужно. Но все равно в результате джойна получиться большая временная таблица за счет повторяющегося текстового поля и группировка по ней всегда файлсорт, даже при наличии индекса на `unique_field`.
...
Рейтинг: 0 / 0
10.12.2013, 19:50:18
    #38496143
Dwr
Dwr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
AkinaCOUNT(DISTINCT info.id)
Гранд мерси.
...
Рейтинг: 0 / 0
10.12.2013, 20:44:26
    #38496200
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
retvizanРечь о том, что размер временной таблицы столь велик, что не поместится в памяти?
Даже если она поместится - не факт что сервер не сольёт её на диск. А поскольку это лог, причём скорее всего пухлый - такой исход более чем вероятен имхо.

retvizanЗдесь и так связь таблиц не по индексу.
Таблицы, DDL коих приведены - не более чем модель, ТС об этом говорит. На боевой системе индексы просто обязаны появиться, чтобы получать результат за вменяемое время.

retvizanAkinaВ общем, оверхед запросто может стать пухлее профита. А на реальной базе указанного назначения - гарантированно станет.Прошу пояснений.
overhead - в данном случае дополнительные затраты ресурсов (в первую очередь времени);
profit - экономия ресурсов (тоже в первую очередь времени).

retvizanгруппировка по ней всегда файлсорт, даже при наличии индекса на `unique_field`.
Не знаю досконально начинки сервера и того, что именно он выберет для выполнения запроса, но группировка-то идёт по моему разумеению всё-таки не по тексту. ТС говорит про какой-то "число-буквенный код", но в структурах модели его нет, так что в этой точке мысль просто останавливается. А если потом окажется, что это некое уникальное (это указано явно) текстовое поле первой таблицы - то в процессе оптимизации ему воленс-неволенс придётся перейти на группировку по первичному индексу.
Сортировка же конечного набора по групповой функции SUM() - да, по-любому файлсорт, куда деваться.
...
Рейтинг: 0 / 0
10.12.2013, 21:23:44
    #38496233
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
.. info join transactions .. group by .. order by -- вариант 1
.. info join (select ..transactions .. group by .. order by) -- вариант 2

AkinaretvizanРечь о том, что размер временной таблицы столь велик, что не поместится в памяти?
Даже если она поместится - не факт что сервер не сольёт её на диск. А поскольку это лог, причём скорее всего пухлый - такой исход более чем вероятен имхо. А если к каждой строке этого лога добавить до группировки `some_data` text из первой таблицы (вариант 1), то ситуация значительно ухудшится.


AkinaНе знаю досконально начинки сервера и того, что именно он выберет для выполнения запроса, но группировка-то идёт по моему разумеению всё-таки не по тексту. ТС говорит про какой-то "число-буквенный код", но в структурах модели его нет,Почему нет? `unique_field` tinytext,

В первом варианте у нас сначала выполняется join. На выход огромная временная таблица за счет повторения `some_data` text. Группировка при этом файлсорт даже, если есть индекс на `unique_field` (будь он хоть primary). А потом ещё и сортировка файлсорт на длинных строках за счет `some_data`.

Во втором варианте: группировка по индексу; сортировка файлсорт, но строки короче за счет отсутствия `some_data` text (правда нужен straight join). Связь же подзапроса с первой таблицей по индексу.

Мой вопрос про overhead и profit в том, что я не вижу за счет чего вариант 2 может быть хуже в отличие от обратного.
...
Рейтинг: 0 / 0
10.12.2013, 23:34:24
    #38496300
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
retvizanя не вижу за счет чего вариант 2 может быть хуже в отличие от обратного.
Ну во-первых, вариант 2 будет немного не таким, он будет

.. info join (select ..transactions .. group by ..) order by...

В случае сортировки в подзапросе она просто будет сервером проигнорирована.

Во-вторых, при наличии покрывающего индекса в первом варианте к таблице транзакций вообще не будет обращений.

И в очередной раз повторюсь - group by unique_field в любом случае есть БСК. Правда, в зависимости от того, из какой он таблицы, это будет разный БСК. Группить надо по первичному ключу.
...
Рейтинг: 0 / 0
11.12.2013, 00:22:27
    #38496320
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
AkinaНу во-первых, вариант 2 будет немного не таким, он будет

.. info join (select ..transactions .. group by ..) order by...

В случае сортировки в подзапросе она просто будет сервером проигнорирована.
Почему проигнорирована? Можно ссылку?

Для оптимизации сортировки вар2 нужно переписать в виде

.. (select ..transactions .. group by .. order by..) straight_join info ..

тогда сортировка по сумме будет в подзапросе, а join добавит текстовые данные из первой таблицы к уже отсортированному результату.


Но сортировка вопрос вторичный, это незначительное улучшение. Основная мысль была в другом.
MySQL выполняет запрос последовательно: join, where, group by, having, order by, limit.
После того как мы сделали
.. info i join transactions t..
у нас получилась избыточная временная таблица без каких-либо индексов ( `unique_field` tinytext, `some_data` text, `value` int,). И уже по ней будет идти группировка. И никакие индексы в исходных таблицах исправить ситуацию не смогут. Собственно подзапрос и нужен, чтобы группировка шла по индексу.

А что такое БСК?
...
Рейтинг: 0 / 0
11.12.2013, 08:36:39
    #38496426
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
retvizanЗдесь и так связь таблиц не по индексу.а в вашем варианте с подзапросом - уже нет, т.к. на базовых таблицах нужные индексы могут/должны быть, а на результат подзапроса их никак не повесить
retvizanПочему проигнорирована? Можно ссылку?а какую вам надо ссылку на то, что порядок записей в таблицах не учитывается? а результат подзапроса и является одной из таблиц...
retvizanА что такое БСК? http://ru.wikipedia.org/wiki/БСК
...
Рейтинг: 0 / 0
11.12.2013, 08:39:35
    #38496428
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
+
Ваш вариант может сработать лучше только в том случае, если свёртка таблицы transactions получится маленькой (меньше, скажем, 1000 записей) в то время, как исходных данных в transactions в разы, а лучше на порядки больше.
Если свёртка будет большой, то от этого будет только вред, почему, см.выше, Акина всё расписал.
...
Рейтинг: 0 / 0
11.12.2013, 09:28:06
    #38496456
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подклейка суммы из разных таблиц
retvizanПочему проигнорирована? Можно ссылку?
Под "сортировка учитывается" мы понимаем "ретранслируется в результат", так? впрочем, если нет - то я вообще не понимаю, о чём идёт речь...

Про то, что это не файловая БД, уже сказали. Но попробуй минимально включить логику.

Допустим, порядок сортировки в подзапросе учитывается (непонятно, как, но допустим). Теперь представь, что у тебя ДВА подзапроса, и в каждом своя сортировка...

retvizanMySQL выполняет запрос последовательно: join, where, group by, having, order by, limit.Ты не поверишь, но это НЕ ТАК. Вот если полностью заблокировать оптимизатор - то да, но кому такой сервер будет нужен?

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


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