Я не прошу решить конкретную задачу, а хочу научиться принципу. Есть база (mysql) с очень большими как горизонтально, так и вертикально таблицами. Необходимо формировать различного вида таблицы-отчеты, желательно используя только SQL-запросы в целях ускорения работы.
В чем сложность:
В генерируемых таблицах некоторые ячейки должны содержать вычисленные значения, например одна ячейка должна быть такой: из другой таблицы получить список записей с определенным `name`, найти значение `name` с вторым по большинству `value`, другая ячейка должна содержать имя колонки из другой таблицы, третья - значение полученное вообще из другой базы данных, пятая - сумму значение с определенным name. В общем, значения в ячейках могут вычисляться по разному.
Как это я делаю сейчас, используя императивное программирование:
Обертка на python, листает в цикле огромный список name'ов (который получает SELECT'ом) и использует каждое значение как параметр для stored procedure, которая, в свою очередь, создает для каждой ячейки которую надо вычислить временную таблицу, все они потом вставляются в таблицу результата, то есть происходит что-то типа:
CREATE TEMPORARY TABLE `tmp1` ENGINE=MEMORY AS (SELECT * FROM `input` WHERE `name`="xxx")
...
INSERT INTO `result`
SELECT
tmp1.id AS id,
count(tmp2.names) AS count_names,
max(tmp3.values) AS max_value,
tmp4.second_max AS second_max,
...
FROM tmp1, tmp2, tmp3, tmp4
Предполагаю, что эта схема не оптимальна, да и хочется использовать только чистый SQL, пробовал применить LOOP, но почему-то производительность упала в десятки раз, да и императивное программирование на SQL, на мой взгляд, это ад.
Как вообще писать такие сложные запросы в декларативном стиле, которые разом обрабатывают кучу строк? Гуру SQL, поделитесь.