
Ринат
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
Нашел кое что, вроде интересно, может кому нибудь будет тоже интересно

Danil
07.09.2017
04:12: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 — самые полезные и интересные каналы на просторах Телеграм. Присоединяйся.

Fike
08.09.2017
23:52:16

Danil
09.09.2017
04:49:55

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
ниче не показывает, пусто

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

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

lost
09.09.2017
07:24:47
Оно и так криво написано
Не должно быть таких запросов
Второй запрос можно посчитать на лету, его не обязательно сохранять

Lucky
09.09.2017
07:26:08

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

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

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
нет, они просто для контроля, ну и при удалении используются
и еще вопрос, для ускорения м.б. имеет смысл сделать колонку ctr интовой? А при его расчете просто умножить соотношение на единицу с 8 нулями

lost
09.09.2017
08:25:12
Выйгрыш на спичках
У тебя проблема с доступом к данным
А не с расчётом колонки

Alexey
09.09.2017
09:05:38

Ad.x ??
09.09.2017
09:08:26

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, и т.д.
не знаю, что понимается под "крайне нежелательно". у обновления индекса есть стоимость, да