|
|
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
Господа, помогите, пожалуйста, с нубской задачкой. Есть две условных таблицы, info и transactions: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. В транзакции падает куча данных, с разным value и одинаковым unique_field. Мне нужно сложить все value в транзакциях и подклеить их к выборке из info по unique_field, попутно отсортировав вывод по убыванию SUM(value). Пробовал просто поочередно выбирать, но тогда у меня все значения value складываются :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 00:59:10 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
Dwr, Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 05:04:21 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
tanglir, да, что-то похожее я и сделал. Но тогда в sum(value) кладутся вообще все транзакции, а мне нужны только те, что с одинаковым unique_field. Условно наполнение такое: Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 10:24:30 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
...а должен получить Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 10:34:39 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
Dwrчто-то похожее я и сделал. Но тогда в sum(value) кладутся вообще все транзакцииЗначит, сделал совершенно непохожее. Будь внимательнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 11:01:38 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
Akina, да я уже проверил и перепроверил несколько раз, все как по учебнику. А еще выбирается только первый unique_field, второй и последующие не выбираются. Может быть, проблема в одинаковых id? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 11:20:58 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
Покажите свой запрос, что ли... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 11:24:06 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
Akina, Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 11:33:14 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
Ну! а я что говорю... Где в твоём запросе, жёваный крот, группировка? перепроверил он... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 12:11:43 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
Akina, а-а-а!.. "Признаю свою вину, меру, силу, глубину". /me стыдно очень-очень. Спасибо всем за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 12:23:20 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
Dwrда я уже проверил и перепроверил несколько раз, все как по учебнику. А еще выбирается только первый unique_field, второй и последующие не выбираются. Может быть, проблема в одинаковых id? Неправильный учебник. Проблема в том, что вы неправильно делаете группировку. Подробнее см http://sqlinfo.ru/forum/viewtopic.php?id=6240 Окончательный запрос нужен вида .. from info join (подзапрос с группировкой) .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 12:24:15 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
retvizanОкончательный запрос нужен вида .. from info join (подзапрос с группировкой) ..А вот это уже с потолка взято. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 12:45:08 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
AkinaretvizanОкончательный запрос нужен вида .. from info join (подзапрос с группировкой) ..А вот это уже с потолка взято. Почему? Джойнить, а потом проводить группировку по текстовому полю первой таблицы - плохое решение с т.з. производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 13:11:13 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
retvizanПочему? Джойнить, а потом проводить группировку по текстовому полю первой таблицы - плохое решение с т.з. производительности. Ну например потому, что при объёмном результате подзапроса он будет закэшен на диск. Или потому, что прощай использование индекса. Вернее, и. В общем, оверхед запросто может стать пухлее профита. А на реальной базе указанного назначения - гарантированно станет. Кроме того, если поле группировки есть уникальное поле левой таблицы - то чхать с высокой колокольни на неправильность запроса с точки зрения классического сиквела. Кстати, с какого потолка взято, что группить он собрался по тексту? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 13:59:09 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
>> если поле группировки есть уникальное поле левой таблицы Все верно, уникальное. >> группить он собрался по тексту? Да. Вернее, по число-буквенному коду. Кстати, никто не подскажет, как подсчитать кол-во строк с таким запросом? А то мне почему-то кажется, что выбирать их все для такой задачи - моветон. Но COUNT() глупости какие-то показывает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 17:36:44 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
[quot DwrCOUNT() глупости какие-то показывает...[/quot] COUNT(DISTINCT info.id) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 19:09:57 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
AkinaНу например потому, что при объёмном результате подзапроса он будет закэшен на диск.Не понял смысла фразы. Речь о том, что размер временной таблицы столь велик, что не поместится в памяти? AkinaИли потому, что прощай использование индекса. Вернее, и.Здесь и так связь таблиц не по индексу. А если был бы индекс, то к данным подзапроса по индексу клеим данные из первой таблицы. Кроме того в случае индекса группировка в подзапросе хорошо на него ляжет. AkinaВ общем, оверхед запросто может стать пухлее профита. А на реальной базе указанного назначения - гарантированно станет.Прошу пояснений. AkinaКроме того, если поле группировки есть уникальное поле левой таблицы - то чхать с высокой колокольни на неправильность запроса с точки зрения классического сиквела. Кстати, с какого потолка взято, что группить он собрался по тексту?Согласен, что группировать по всем полям здесь не нужно. Но все равно в результате джойна получиться большая временная таблица за счет повторяющегося текстового поля и группировка по ней всегда файлсорт, даже при наличии индекса на `unique_field`. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 19:36:35 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
AkinaCOUNT(DISTINCT info.id) Гранд мерси. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 19:50:18 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
retvizanРечь о том, что размер временной таблицы столь велик, что не поместится в памяти? Даже если она поместится - не факт что сервер не сольёт её на диск. А поскольку это лог, причём скорее всего пухлый - такой исход более чем вероятен имхо. retvizanЗдесь и так связь таблиц не по индексу. Таблицы, DDL коих приведены - не более чем модель, ТС об этом говорит. На боевой системе индексы просто обязаны появиться, чтобы получать результат за вменяемое время. retvizanAkinaВ общем, оверхед запросто может стать пухлее профита. А на реальной базе указанного назначения - гарантированно станет.Прошу пояснений. overhead - в данном случае дополнительные затраты ресурсов (в первую очередь времени); profit - экономия ресурсов (тоже в первую очередь времени). retvizanгруппировка по ней всегда файлсорт, даже при наличии индекса на `unique_field`. Не знаю досконально начинки сервера и того, что именно он выберет для выполнения запроса, но группировка-то идёт по моему разумеению всё-таки не по тексту. ТС говорит про какой-то "число-буквенный код", но в структурах модели его нет, так что в этой точке мысль просто останавливается. А если потом окажется, что это некое уникальное (это указано явно) текстовое поле первой таблицы - то в процессе оптимизации ему воленс-неволенс придётся перейти на группировку по первичному индексу. Сортировка же конечного набора по групповой функции SUM() - да, по-любому файлсорт, куда деваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 20:44:26 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
.. 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 может быть хуже в отличие от обратного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 21:23:44 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
retvizanя не вижу за счет чего вариант 2 может быть хуже в отличие от обратного. Ну во-первых, вариант 2 будет немного не таким, он будет .. info join (select ..transactions .. group by ..) order by... В случае сортировки в подзапросе она просто будет сервером проигнорирована. Во-вторых, при наличии покрывающего индекса в первом варианте к таблице транзакций вообще не будет обращений. И в очередной раз повторюсь - group by unique_field в любом случае есть БСК. Правда, в зависимости от того, из какой он таблицы, это будет разный БСК. Группить надо по первичному ключу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 23:34:24 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
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,). И уже по ней будет идти группировка. И никакие индексы в исходных таблицах исправить ситуацию не смогут. Собственно подзапрос и нужен, чтобы группировка шла по индексу. А что такое БСК? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2013, 00:22:27 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
retvizanЗдесь и так связь таблиц не по индексу.а в вашем варианте с подзапросом - уже нет, т.к. на базовых таблицах нужные индексы могут/должны быть, а на результат подзапроса их никак не повесить retvizanПочему проигнорирована? Можно ссылку?а какую вам надо ссылку на то, что порядок записей в таблицах не учитывается? а результат подзапроса и является одной из таблиц... retvizanА что такое БСК? http://ru.wikipedia.org/wiki/БСК ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2013, 08:36:39 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
+ Ваш вариант может сработать лучше только в том случае, если свёртка таблицы transactions получится маленькой (меньше, скажем, 1000 записей) в то время, как исходных данных в transactions в разы, а лучше на порядки больше. Если свёртка будет большой, то от этого будет только вред, почему, см.выше, Акина всё расписал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2013, 08:39:35 |
|
||
|
Подклейка суммы из разных таблиц
|
|||
|---|---|---|---|
|
#18+
retvizanПочему проигнорирована? Можно ссылку? Под "сортировка учитывается" мы понимаем "ретранслируется в результат", так? впрочем, если нет - то я вообще не понимаю, о чём идёт речь... Про то, что это не файловая БД, уже сказали. Но попробуй минимально включить логику. Допустим, порядок сортировки в подзапросе учитывается (непонятно, как, но допустим). Теперь представь, что у тебя ДВА подзапроса, и в каждом своя сортировка... retvizanMySQL выполняет запрос последовательно: join, where, group by, having, order by, limit.Ты не поверишь, но это НЕ ТАК. Вот если полностью заблокировать оптимизатор - то да, но кому такой сервер будет нужен? Да, для того, чтобы перейти от программистского мышления к SQL-программистскому, просто жизненно необходимо воспринять эту концепцию - сперва получить всё потом отбросить ненужное. Однако сие вовсе не означает, что такая концепция реализуется на самом деле... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2013, 09:28:06 |
|
||
|
|

start [/forum/topic.php?fid=47&tid=1835523]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 340ms |

| 0 / 0 |
