@mysql_ru

Страница 66 из 142
Ринат
06.09.2017
13:28:38
не могу повернуть запрос так чтобы для item выводить минимальную из calc_price

если поставить группировку по i.id, то сумму посчитает сложив все цены

lost
06.09.2017
13:30:32
оберни в подзапрос и примени агрегацию ещё раз

Ринат
06.09.2017
13:33:40
SELECT t.item, MIN(t.calc_price) FROM ( SELECT p.item, p.id, SUM(IF(i.collection_id = 1, pi.cost_moscow, pi.cost) * pp.count) as calc_price FROM prices p JOIN items i ON i.id = p.item JOIN pr_price pp ON pp.price = p.id AND pp.count > 0 JOIN pr_items pi ON pi.id = pp.pr2_item AND pi.type <> 4 WHERE p.spp_id = 0 GROUP BY p.id ORDER BY p.item) as t GROUP BY t.item

Google
Ринат
06.09.2017
13:33:43
так?

вроде считает. Это норм способ7

lost
06.09.2017
13:39:02
это норм способ

Ринат
06.09.2017
13:41:07
Спасибо!

а если сразу заапдейтить поле calc_price в табличку items по t.item ?

lost
06.09.2017
14:25:29
так а как ты заапдейтиш сумму, если ты ее из нескольких строк собираешь

Ринат
06.09.2017
14:27:06
ну там же 1 айди одна сумма

lost
06.09.2017
14:29:17
ага, а собираешь ты его из 3 строк

условно

Riedrian
07.09.2017
04:05:37
Нашел кое что, вроде интересно, может кому нибудь будет тоже интересно

Sergey
07.09.2017
15:17:02
Этот вопрос меня мучал ооочень долго, и до сих пор терзает как лучше делать Смотри вот Вот есть в БД таблицы state(id, name) lake(id, state.id , name) (у одной области есть много озер) мне нужно сделать выборку из бд в таком виде [ [ name => state_1, lakes => [ // можно и lake [ name => lake_1, ] [ name => lake_2, ] [ name => lake_n, ] ] ], [ name => state_2, lakes => [ [ name => lake_1, ] [ name => lake_2, ] [ name => lake_n, ] ] ], [ name => state_3, lakes => [ [ name => lake_1, ] [ name => lake_2, ] [ name => lake_n, ] ] ], ] я групирую в строку по разделителю (group_concat()), а на сервере эту строку разбиваю по разделителю в массив ( explode(var, ',') ) Подробнее: https://tagmycode.com/snippet/7091

PHP

Google
Fike
07.09.2017
15:19:39
sql возвращает только двухмерные таблицы, объединять на строне принимающего кода

Sergey
07.09.2017
15:27:40
т.е. Это невозможно? А в postgresql возможно\?

lost
07.09.2017
15:28:09
это возможно только это говнокод

Vaw
08.09.2017
23:48:10
https://telegram.me/telegidka — самые полезные и интересные каналы на просторах Телеграм. Присоединяйся.

Ad.x ??
09.09.2017
05:43:28
Утречка всем. Вопросец такой: Обычный такой запрос UPDATE `videos_stats` SET `current_shows`=`current_shows`+1 WHERE (`image_id` IN (27605, 24818, 24564, 26009, 24234, 27666, 26313, 27552, 23075, 24697, 25386, 26729, 24191, 24016, 27545, 26804, 20854, 21848, 23620, 25917, 24573, 24597, 24851, 27285, 27292, 27518, 23554, 24021, 24881, 27221)) AND (`category_id`='13') Периодически выдает ошибку Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction При это транзакций с таблицей никаких нет. Двиг InnoDB бд MySql. Чот не могу нагуглить как решить проблему, подскажите в каком направлении копать, или решение =)

lost
09.09.2017
06:22:33
Show engine innodb status с секцией last detected deadlock скидывай

Движок innodb транзакционный, даже если ты не делаешь явный start transaction это все равно будет транзакция

Ad.x ??
09.09.2017
06:42:15
ниче не показывает, пусто

Show engine innodb status с секцией last detected deadlock скидывай
зашарил скрин. ВИдно ага какой запрос локнул, и что делать в этой ситуации не понятно (обновление кликов/показам кроном делается,т.е. другое соединение вообще)

lost
09.09.2017
07:22:57
У тебя второй запрос блочит всю таблицу

Alexey
09.09.2017
07:23:34
Ну в общем дедлоки - это неизбежное следствие MVCC. Приложение в любом случае должно проверять и обрабатывать такие ошибки, иначе оно криво написано

Ты можешь минимизировать их в своём конкретном случае. Но обработка ошибок все равно должна быть

lost
09.09.2017
07:24:47
Оно и так криво написано

Не должно быть таких запросов

Второй запрос можно посчитать на лету, его не обязательно сохранять

Alexey
09.09.2017
07:26:49
А где второй? Я с телефона, что-то не разгляжу

lost
09.09.2017
07:27:26
Ищи под (2) transaction

Google
lost
09.09.2017
07:28:16
Там еще разделяемая блокировка на строки из этой таблицы, возможно там что то еще перед этим апдейтом выполняется

Именно перед вторым апдейтом

Ad.x ??
09.09.2017
07:39:22
Второй запрос можно посчитать на лету, его не обязательно сохранять
т.е. вместе с апдейтом просмотра или клика обновлять сразу соотношение? Оно будет корректно работать в 1 запросе? (имею в виду по актуальным данным, клик и просмотр изменились же)

lost
09.09.2017
07:40:07
Я имел ввиду что соотношение вообще не стоило заводить в отдельной колонке

И считать его по всей таблице

Ad.x ??
09.09.2017
07:40:59
т.е. при выборке его считать?

lost
09.09.2017
07:41:07
Да

Ad.x ??
09.09.2017
07:41:18
по это соотношению индекс есть, т.е. основная сортировка

lost
09.09.2017
07:41:40
Зачем хранить избыточные данные, и еще сервер насиловать подобными запросами

Ad.x ??
09.09.2017
07:42:07
так при каждом запросе и так считать будет и сортировать

разве нет?

lost
09.09.2017
07:43:06
Будет, но если у тебя с индексами все в порядке это будет очень быстро

Alexey
09.09.2017
07:43:38
в mysql 5.7 есть ещё generated columns

вот для таких вещей, в том числе

lost
09.09.2017
07:45:22
Кстати да

Alexey
09.09.2017
07:45:25
а вообще, я думаю дедлоки пропадут, если id-шники в длинном UPDATE сортировать. а во втором использовать ORDER BY. но это не отменяет всего остального сказанного

Ad.x ??
09.09.2017
07:46:50
Будет, но если у тебя с индексами все в порядке это будет очень быстро
total_clicks и total_shows тоже вычисляются по всей таблице разом в томже кроне, но они не индексные

lost
09.09.2017
07:48:30
Это не играет роли

У тебя вся таблица обновляется

Google
Ad.x ??
09.09.2017
07:50:25
https://pastebin.com/eVdYDnhZ

lost
09.09.2017
07:54:26
Опа

Ключики

Со связанными ключами таблицами что то перед обновлением выполняется?

Ad.x ??
09.09.2017
07:56:29
нет, они просто для контроля, ну и при удалении используются

в mysql 5.7 есть ещё generated columns
почитал, вроде как раз то. Но будет ли оно работоать в случае когда 1 генерированная колонка будет вычисляться из двух других генерированных? ))

и еще вопрос, для ускорения м.б. имеет смысл сделать колонку ctr интовой? А при его расчете просто умножить соотношение на единицу с 8 нулями

lost
09.09.2017
08:25:12
Выйгрыш на спичках

У тебя проблема с доступом к данным

А не с расчётом колонки

Ad.x ??
09.09.2017
09:08:26
очень рекомендую DOUBLE вместо FLOAT
8 байт против 4... точность не так важна

Alexey
09.09.2017
09:11:29
сэкономив 4 байта, ты получишь примерно на 5% меньше размер таблицы, но кучу потенциальных проблем взамен

я не знаю предметной области. но лучше FLOAT вообще избегать. такой себе тип данных, не о чём

Ad.x ??
09.09.2017
09:12:43
ясно, спасибо )

чет подумал, если есть индекс по генерированной колонке, как оно себя вести будет в этом случае? При каждом апдейте перестраивать?

Alexey
09.09.2017
10:14:49
точно так же, как и с обычными колонками. обновлять индекс, если значение в колонке изменилось, иначе не трогать

Ad.x ??
09.09.2017
10:32:44
т.е. частое обновление колонки крайне не желательно... В доке написано что индекс по такой колонке только в памяти хранится

Google
Alexey
09.09.2017
10:42:53
нет, индекс хранится не только в памяти конечно. иначе его пришлось бы перестраивать с нуля при каждом рестарте. он хранится как обычный индекс, обновления пишутся в redo log, и т.д.

не знаю, что понимается под "крайне нежелательно". у обновления индекса есть стоимость, да

Страница 66 из 142