|
|
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
Привет всем, помогите с SQL запросом. Есть таблица с несколькими сотнями тысяч записей id | rate 1 | 15 2 | 15 3 | 10 4 | 20 5 | 25 6 | 20 7 | 15 Мне надо сделать выборку под критерий - сумма рейтинга 32 Мне нужен вывод: id | rate 1 | 15 2 | 15 3 | 10 т.е. как в сумме набралось 32 дальше записи выводить не надо. Таблица InnoDB, эта операций выполняется как часть транзакции, в таблице тысячи записей поэтому необходимо чистая и быстрая реализация :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 18:49:57 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
Одним запросом возможно, но все варианты, которые мне представляеются, будут очень долго работать. Так что лучше, имхо, дергать по одной или несколько записей и суммировать их на клиенте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 19:03:43 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
profitrushПривет всем, помогите с SQL запросом. Есть таблица с несколькими сотнями тысяч записей id | rate 1 | 15 2 | 15 3 | 10 4 | 20 5 | 25 6 | 20 7 | 15 Мне надо сделать выборку под критерий - сумма рейтинга 32 Мне нужен вывод: id | rate 1 | 15 2 | 15 3 | 10 т.е. как в сумме набралось 32 дальше записи выводить не надо. Таблица InnoDB, эта операций выполняется как часть транзакции, в таблице тысячи записей поэтому необходимо чистая и быстрая реализация :) Это типа роллап задача, решается на переменных. Посмотрите топик выборка ТОП-Н записей в FAQ. Там идет последовательная нумерация для каждой категории (допустим для каждого язера в вашем случае). Вместо нумерации можно сделать роллап сумму . (надо посмотреть внимательно. Наверно надо сумму НЕ включая текушаю запись) Это на первом прогоне. затем просто выбрать записис где роллап_сумма < 32. Два прогона на 200К записей займет 100-300 мс на среднем железе с правильными индексами и правильным кодом. Если нужно на порядок быстрее, то надо будет заранее просчитывать ролап-сумму на вставке триггером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 19:07:51 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
miksoftОдним запросом возможно, но все варианты, которые мне представляеются, будут очень долго работать. Так что лучше, имхо, дергать по одной или несколько записей и суммировать их на клиенте. предлагаешь делат так? авторSQL запрос: SELECT * ... LIMIT 0 , 1 ... скрипт делает вычисления, если суммы нехватило делаем следующий запрос ... SQL запрос: SELECT * ... LIMIT 1 , 1 ... скрипт делает вычисления, если суммы нехватило делаем следующий запрос ... SQL запрос: SELECT * ... LIMIT 2 , 1 мне красиво это некрасиво и будет убийственно для сервера, т.к. суммировать надо будет десятки и иногда сотни строк + еще несколько sql запросов и все это в рамках одной транзакции(( в секунду может быть несколько таких больших транзакций или это хорошее решение? подожду еще мнений, может буду другие варианты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 19:11:32 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
profitrush, Да, примерно так. Только лучше добавить WHERE id> максимальный_id_из_предыдущего_запроса ORDER BY id LIMIT 1 чтобы быстро дергать записи по индексу. profitrushсуммировать надо будет десятки и иногда сотни строкВ показанном примере было всего три записи, я на это и ориентировался. Но можно читать пачками по 100 и более записей. И, имхо, это будет легче, чем перебирать всю таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 19:29:19 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
miksoftprofitrush, Да, примерно так. Только лучше добавить WHERE id> максимальный_id_из_предыдущего_запроса ORDER BY id LIMIT 1 чтобы быстро дергать записи по индексу. profitrushсуммировать надо будет десятки и иногда сотни строкВ показанном примере было всего три записи, я на это и ориентировался. Но можно читать пачками по 100 и более записей. И, имхо, это будет легче, чем перебирать всю таблицу. этот пример простой чтобы не грузить лишней информацией кстати сортировка будет не по id, а по цене товара decimal(15,2) - стоит ли делать индекс для цены непонятно, цена кстати будет часто повторяться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 19:38:08 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
profitrushкстати сортировка будет не по id, а по цене товара decimal(15,2) - стоит ли делать индекс для цены непонятно, цена кстати будет часто повторятьсятогда по паре полей - цена, id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 19:39:03 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
все таки покажите мне пожалуйста хоть пример реализации такого запроса написал сейчас поочередный вывод в несколько запросов с подбором LIMIT, не нравиться такой код((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 20:18:16 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
первый запрос: Код: sql 1. 2. 3. 4. Запрос А: Код: sql 1. 2. 3. 4. 5. prev_id - id из последней записи последнего предыдущего запроса Запрос Б: Код: sql 1. 2. 3. 4. 5. prev_price - price из последней записи последнего предыдущего запроса Порядок выполнения 1) Первый запрос 2) Считаем сумму rate, если достаточно, то выход. 3) Запрос А 4) Считаем сумму rate, если достаточно, то выход. 5) Если запрос А в пункте 3 вернул более одной записи, то переход на пункт 3. 6) Запрос Б 7) Считаем сумму rate, если достаточно, то выход. 8) Если запрос Б в пункте 6 вернул более одной записи, то переход на пункт 3. 9) Таблица окончена, выход. Вроде не напутал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 20:41:20 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
В буржунете подсказали вариант, отлично подошел) единственное мне не нравиться LIMIT 0 , 999999 хотелось бы без него реализацию( Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 21:19:27 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
если не вставить LIMIT 0 , 999999, то он будет дефолтный LIMIT 0 , 30 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 21:20:53 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
profitrushВ буржунете подсказали вариант, отлично подошел) единственное мне не нравиться LIMIT 0 , 999999 хотелось бы без него реализацию( Код: sql 1. 2. 3. 4. 5. 6. 7. ну, если скорость устроит, то ОК. Лимит 0,30 это, наверно у вас в ПХП, в МуСКЛ-е такого дефолта нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 21:38:10 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
javajdbc, да я сглупил, это в phpmyadmin лимит такой ) этот код тоже оказалось не правильно работает если вводишь огранчиение по целым числам то он срабатывает, а вот если ввести например 1.5 то работает не правильно выводит записи сумма которых 1, а не 1.5 Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 21:47:23 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
profitrush, код , похоже, правильный. Это у вас что-то с типом данных, может ИНТ вместо ДЕЦИМАЛ(10,2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 22:01:20 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
javajdbcкод , похоже, правильный.не похоже. 1) сортировка по price, а JOIN по id 2) сортировка по полю, которого нет в группировке. А уж быстродействием тут и не пахнет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 22:25:59 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
javajdbc, Кстати, а Вы случаем не в курсе, что и как в MySQL происходит с незакрытыми курсорами? Я не в курсе, никогда не задавался таким вопросом на практике. Потому как если есть способ со стороны клиента закрыть курсор не вычитывая его до конца, то самое простое просто читать данные в нужной сортировке и суммировать до достижения порога, а потом закрыть курсор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2014, 22:29:02 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
miksoftjavajdbcкод , похоже, правильный.не похоже. 1) сортировка по price, а JOIN по id 2) сортировка по полю, которого нет в группировке. А уж быстродействием тут и не пахнет. Сортировка идет (как я понимаю) после отсечки по HAVING, поэтому 1) неважно. Про 2) --- это случай когда PRICE аттрибуте однозначно зависит от GROUP BY ИД аттрибута, поэтому его не обязательно окружать груповой функцией. Быстродействие тут стандартное для полного перемножения в группе. Если скорость устроит, то и ладно. Ускорение, может быть (а может и нет, зависит от данных): 1) перебором первых значений с быстрой остановкой на лимите (ваш первый вариант) 2) ролап на переменных (мой вариант, оставленый без внимания, наверно сложнее других) 3) расчет каждого значения на тригере при вставке. 4) может еше что-то ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2014, 00:21:12 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
miksoftjavajdbc, Кстати, а Вы случаем не в курсе, что и как в MySQL происходит с незакрытыми курсорами? Я не в курсе, никогда не задавался таким вопросом на практике. Потому как если есть способ со стороны клиента закрыть курсор не вычитывая его до конца, то самое простое просто читать данные в нужной сортировке и суммировать до достижения порога, а потом закрыть курсор. нет , я никогда не кодировал процедуры на МуСКЛ. Мне хватило нескольких лет тежелого кодирования на PL/SQL :-) Обычно очисткой курсора должен заниматся код фреймворка. Выход из цикла кусора есть в любом языве высокго уровня, так что это не должно быть проблемой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2014, 00:27:03 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
javajdbcОбычно очисткой курсора должен заниматся код фреймворка. Выход из цикла кусора есть в любом языве высокго уровня, так что это не должно быть проблемой.Так вот с точки зрения MySQL тут что происходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2014, 00:32:55 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
miksoftjavajdbcОбычно очисткой курсора должен заниматся код фреймворка. Выход из цикла кусора есть в любом языве высокго уровня, так что это не должно быть проблемой.Так вот с точки зрения MySQL тут что происходит? Не в курсе. Давным давно драйверы тупо выбирали все записи и грузили в память. Потом появились бач-подгрузки по , например 100 записей. в любой момент позле подгрузки следуюшуй партии драйвер может закрыть курсор. Так что ускорение точно будет на (умном) клиенте, если он загрузит первые 100 записей и остановить цикл через 15 записей... и остальные 100К не будут грузится вообше. Более детально что происходит внутри я не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2014, 01:04:57 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
странное программирование, надежда на то что промежуточное звено должно делать что-то, что я считаю оно должно делать.... хочешь максимальное быстродействие - убирай промежуточные звенья. всю эту логику можно переместить в хранимку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2014, 08:40:32 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
profitrushПривет всем, помогите с SQL запросом. Есть таблица с несколькими сотнями тысяч записей id | rate 1 | 15 2 | 15 3 | 10 4 | 20 5 | 25 6 | 20 7 | 15 Мне надо сделать выборку под критерий - сумма рейтинга 32 Мне нужен вывод: id | rate 1 | 15 2 | 15 3 | 10 т.е. как в сумме набралось 32 дальше записи выводить не надо. Таблица InnoDB, эта операций выполняется как часть транзакции, в таблице тысячи записей поэтому необходимо чистая и быстрая реализация :) думаю всем очевидно что кроме дёрганья записей с запасом никакой оптимизации нету. поэтому предлагаю делать так открывать курсор(скажем если у тебя минимальное число 1, а надо сумма 32, вот открыть курсор на 32 записи, и вычитывать по одной пока не наберёшь нужную сумму) если записи читаються последовательно, по примари кею, то поидее при первом чтении сразу с шдд дерниться фигова туча записей и будут в буфере, так что получиться быстро. пытаться на шаманить джоинами таблицу на пару тысяч записей среди которых будут нужные 5 - будет медленее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2014, 11:05:55 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
вадявсю эту логику можно переместить в хранимку.Можно. Но не факт, что это уменьшит общее время. Ведь полученные записи из хранимки еще вытащить надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2014, 11:23:08 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
miksoftвадявсю эту логику можно переместить в хранимку.Можно. Но не факт, что это уменьшит общее время. Ведь полученные записи из хранимки еще вытащить надо. что значит вытащить из хранимки данные? хранимка должна возвратить одни результат - конечный. это намного меньше чем многократное обращение к базе через селект ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2014, 12:29:20 |
|
||
|
Как сделать выборку ограниченную по сумме колонки
|
|||
|---|---|---|---|
|
#18+
вадяmiksoftпропущено... Можно. Но не факт, что это уменьшит общее время. Ведь полученные записи из хранимки еще вытащить надо. что значит вытащить из хранимки данные? хранимка должна возвратить одни результат - конечный. это намного меньше чем многократное обращение к базе через селектПо условию задачи нужно вернуть набор записей, а не "один результат". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2014, 12:37:20 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38614826&tid=1834977]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 324ms |

| 0 / 0 |
