Dimasick
17.09.2014 - 00:05
Есть таблицы T1, T2,..., Tn (n заранее неизвестно, но не более 100) с полями id, V (в каждой). Как создать таблицу S с полями id, sum, где в поле sum будет находиться сумма значений V из всех таблиц T1, T2,..., Tn (с соответствующим id). Например, id - идентификатор работника, V - его зарплата, в таблице T1 записаны зарплаты за январь, Т2 - а февраль,... и т.д., а нужна сводная таблица, где показано, сколько кто получил за все прошедшие месяцы. Каждый месяц при этом будет добавляться новая таблица Tk и в таблице S при этом должны как-то автоматом пересчитываться суммы.
Я пока вижу один способ - вычислить (sql-запросом из php-файла) количество таблиц (n), в цикле получать значения из каждой таблицы и обновлять потом таблицу S. А можно ли как-то проще?
Valick
17.09.2014 - 00:26
Dimasick, честно сказать? Вы не видите нихрена.
Вы так сильно обидели реляционную БД что даже представить себе не можете на сколько.
Нельзя так обращаться с БД, иначе она ответит вам тем же.
1) при работе с БД вообще забудьте что такое циклы, и что они существуют в природе.
Если при работе с БД у вас возникает потребность в цикле, знайте 100% вы что-то делаете неправильно.
2) прочитайте что такое нормализация БД, и выучите три первые нормальные формы.
3) одна сущность - одна таблица (это на первых порах аксиома)
_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
17.09.2014 - 00:43
Чуть конкретизирую то, что сказал Валик:
Цитата (Dimasick @ 17.09.2014 - 00:05) |
Есть таблицы T1, T2,..., Tn (n заранее неизвестно, но не более 100) с полями id, V (в каждой). |
Вот из этого надо сделать сначала одну таблицу, с полями (id, V, d). Где d - это год и месяц.
Тогда будет всего одна таблица, а "сводная таблица" будет получаться из основной одним запросом.
Всё остальное (куча таблиц, по одной на месяц) - колхоз и извращение. Так что сначала переделай структуру БД и логику приложения, потом можно будет говорить о том, как сделать правильный запрос с суммами.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
Dimasick
17.09.2014 - 01:09
Valick, честно сказать? Вы за лесом деревья уже и не видите. Не пафоса и патетики ожидает вопрошающий, н помощи по сути. Циклы прекрасно пишутся на php и в цикле чудесно можно обращаться к разным таблицам (равно как и к разным БД).
Valick, sergeiss, вы абсолютно правы в том, что так нарезать таблицы не есть гуд, но, скажу я и снова повторю это "но" - не я создавал эти таблицы и нет у меня возможности их перекраивать, т.к. на их структуре завязана работа множества других скриптов.
Ежели кто вдруг знает, как можно получить таблицу сумм проще, чем в описанном мной методе, с радостью выслушаю.
Valick
17.09.2014 - 01:13
Dimasick, пафоса никаого нет, я под коняком
_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
17.09.2014 - 09:18
Цитата (Dimasick @ 17.09.2014 - 01:09) |
не я создавал эти таблицы и нет у меня возможности их перекраивать, |
В таком случае сначала получи список нужных таблиц. Я надеюсь, этот процесс можно автоматизировать, названия таблиц должны как-то соответствовать периодам времени. Затем создай один запрос: вложенный запрос объединяет через UNION все таблицы в одну, а затем, тут же, из них получаешь то, что нужно. Заодно при объединении добавь еще одно поле, которое будет четко идентифицировать, к какому периоду времени относятся данные.
И еще. Если есть возможность, найди того, кто сделал такую структуру данных, и переставь ему руки из задницы к плечам
Цитата (Dimasick @ 17.09.2014 - 01:09) |
Циклы прекрасно пишутся на php и в цикле чудесно можно обращаться к разным таблицам (равно как и к разным БД). |
Если этого можно избежать, то лучше этого избежать. Потому что обращение по циклу к разным таблицам получается по времени достаточно долгим и сильно нагружает БД.
Надо стремиться по возможности делать всё одним запросом. Если не получается, то да, можно и в цикле погонять.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
bestxp
17.09.2014 - 09:30
Вообще-то бывают причины когда так денормализуют, но тогда всё равно общая должна оставаться
Valick
17.09.2014 - 09:38
Цитата |
Вообще-то бывают причины когда так денормализуют |
Цитата |
n заранее неизвестно, но не более 100 |
sergeiss
17.09.2014 - 11:19
Цитата (bestxp @ 17.09.2014 - 09:30) |
Вообще-то бывают причины когда так денормализуют |
Если честно, то не могу представить. Разве что сделать что-то типа "а-ля партиции". Но тогда уж лучше использовать стандартный механизм работы с партициями, чем извращаться с кучей таблиц.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
bestxp
17.09.2014 - 11:23
причин много статистика посещений например когда у тебя в таблице овер 1млрд записей и некоторые запросы выполняются более 30 секунд, а работать надо только например с данными за месяц
или "архивация" данных для уменьшения объема бд и в случае необходимости быстрого получения доступа к ним и тд)
sergeiss
17.09.2014 - 15:09
Цитата (bestxp @ 17.09.2014 - 11:23) |
причин много статистика посещений например когда у тебя в таблице овер 1млрд записей и некоторые запросы выполняются более 30 секунд, а работать надо только например с данными за месяц
или "архивация" данных для уменьшения объема бд и в случае необходимости быстрого получения доступа к ним и тд) |
Это всё выполняется партициями.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.