Выполняется MySQL запрос: select `key`, `field` from `table` where `key` in (key1, key2, key3)
Затем пробегаемся по результату: result += array[key]*field
В итоге нужное число в переменной «result»
Вопрос:
Можно ли как то ограничиться одним mysql запросом, чтобы в нем уже был «result», что-то типа: select sum(`table`.`field`*`temp`.`value`) from `table`, (key1 => value1, key2 => value2, key3 => value3) as `temp` where `key` in (key1, key2, key3) and `table`.`key`=`temp`.`key`
На ум приходит только, генерация вложенного if select sum(`field`*if(`key`=key1,value1,if(`key`=key2,value2,if(`key`=key3,value3,и т.д.))) from `table` where `key` in (key1, key2, key3)
Но, как понимаете, это не дело.
Во-первых, вы очень плохо задали вопрос, что трудно его понять.
Во-вторых, вы усложняете себе жизнь по моему. Конечно, можно засунуть массив в SQL запрос, отправить его на сервер, там перемножить и вернуть результат, но зачем? Это же наркоманство какое-то. Умножать надо на стороне приложения.
Если вам принципиально умножать на сервере — создайте таблицу с значениями из массива, делайте JOIN и перемножайте хоть до посинения:
SELECT SUM(table.field * arrayTable.value) FROM table LEFT JOIN arrayTable ON table.key = arrayTableKey WHERE table.key IN (....)
Вариант с созданием таблицы не подходит, таких запросов много и для каждой создавать таблицу, не выгодно в плане скорости.
Созданием этой темы хотел узнать, есть ли способ вставки массива в запрос (одним запросом), о котором я не знаю. Если бы был, то так скорее всего было бы быстрее, чем на стороне приложения.
Нет, нету, единственный способ, это через многократные if(), и это только усложняет разбор запроса сервером. Что ж у вас за язык программирования такой, что быстрее заставлять MySQL умножать числа :)
Да от языка, я думаю, не зависит, select выдает несколько строк, и потом в цикле, обращаясь по очереди к каждой возвращаемой запросом строке, приходится это всё умножать.
Например, если представить массив 100 000 значений, и select запрос, который это всё возвращает. То тут однозначно бы было очень медленно всё. А если бы был этот массив в таблице, то намного быстрее бы это умножилось и сложилось, и MySQL бы не пришлось возвращать такое количество строк.
Но у меня небольшое количество строк, поэтому не принципиально, просто хотел узнать есть ли способ.
Нет, так нет. Буду знать :)
Так массив из 100000 значений надо как-то вписать в запрос, преобразовав в строку (он же у вас каждый раз новый), потом его надо передать, потом его должен разобрать из строки сервер SQL, один хрен вам приходится кучу чисел по сети гонять, вместо того, чтобы сразу в приложении на месте перемножить.
Тут еще такой момент: с ростом нагрузки поставить второй веб-сервер для приложения гораздо проще дешевле, чем разнести базу данных на 2 и более серверов (это потребует переписать код) — потому традиционно стараются грузить приложение, а не базу данных (в хорошем масштабируемом приложении БД делает только самые простые запросы по индексам, без JOIN и прочих сложностей).