powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подклейка суммы из разных таблиц
25 сообщений из 41, страница 1 из 2
Подклейка суммы из разных таблиц
    #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
Подклейка суммы из разных таблиц
    #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
Подклейка суммы из разных таблиц
    #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
Подклейка суммы из разных таблиц
    #38495067
Dwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dwr
Гость
...а должен получить

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

да я уже проверил и перепроверил несколько раз, все как по учебнику. А еще выбирается только первый unique_field, второй и последующие не выбираются. Может быть, проблема в одинаковых id?
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495150
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите свой запрос, что ли...
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #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
Подклейка суммы из разных таблиц
    #38495239
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну! а я что говорю... Где в твоём запросе, жёваный крот, группировка? перепроверил он...
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495275
Dwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dwr
Гость
Akina,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

retvizanгруппировка по ней всегда файлсорт, даже при наличии индекса на `unique_field`.
Не знаю досконально начинки сервера и того, что именно он выберет для выполнения запроса, но группировка-то идёт по моему разумеению всё-таки не по тексту. ТС говорит про какой-то "число-буквенный код", но в структурах модели его нет, так что в этой точке мысль просто останавливается. А если потом окажется, что это некое уникальное (это указано явно) текстовое поле первой таблицы - то в процессе оптимизации ему воленс-неволенс придётся перейти на группировку по первичному индексу.
Сортировка же конечного набора по групповой функции SUM() - да, по-любому файлсорт, куда деваться.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #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
Подклейка суммы из разных таблиц
    #38496300
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanя не вижу за счет чего вариант 2 может быть хуже в отличие от обратного.
Ну во-первых, вариант 2 будет немного не таким, он будет

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

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

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

И в очередной раз повторюсь - group by unique_field в любом случае есть БСК. Правда, в зависимости от того, из какой он таблицы, это будет разный БСК. Группить надо по первичному ключу.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #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
Подклейка суммы из разных таблиц
    #38496426
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanЗдесь и так связь таблиц не по индексу.а в вашем варианте с подзапросом - уже нет, т.к. на базовых таблицах нужные индексы могут/должны быть, а на результат подзапроса их никак не повесить
retvizanПочему проигнорирована? Можно ссылку?а какую вам надо ссылку на то, что порядок записей в таблицах не учитывается? а результат подзапроса и является одной из таблиц...
retvizanА что такое БСК? http://ru.wikipedia.org/wiki/БСК
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38496428
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+
Ваш вариант может сработать лучше только в том случае, если свёртка таблицы transactions получится маленькой (меньше, скажем, 1000 записей) в то время, как исходных данных в transactions в разы, а лучше на порядки больше.
Если свёртка будет большой, то от этого будет только вред, почему, см.выше, Акина всё расписал.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38496456
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanПочему проигнорирована? Можно ссылку?
Под "сортировка учитывается" мы понимаем "ретранслируется в результат", так? впрочем, если нет - то я вообще не понимаю, о чём идёт речь...

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

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

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

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


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