История тарифных планов

Технические вопросы по UTM 5.0
Ответить
link
Сообщения: 2
Зарегистрирован: Пн апр 28, 2008 10:12

История тарифных планов

Сообщение link »

Добрый день.
Стоит задача написать запрос, который возвращал бы id тарифного плана, который был у пользователя в заданном (например, предыдущем) расчетном периоде.
В таблице tariffs_history хранится информация только о первом привязанном тарифном плане.
В таблице account_tariff_link подобной информации нет, поскольку при смене тарифного плана модифицируется уже существующая запись пользователя, т.е. есть информация только о текущем тарифном плане.
Кто-нибудь решал такую задачу?

mikkey finn
Сообщения: 1612
Зарегистрирован: Пт ноя 10, 2006 15:23

Сообщение mikkey finn »

делаете простую выборку значений из таблицы, где расч период должен попадать в диапазон "больше чем дата прилинковки" и "меньше чем дата отлинковки". Если ни одна запись критерию не соответствует, то значит в указанном расч периоде пользователь обслуживался по текущему тарифному плану.

Аватара пользователя
Magnum72
Сообщения: 1947
Зарегистрирован: Чт сен 22, 2005 06:54
Контактная информация:

Re: История тарифных планов

Сообщение Magnum72 »

link писал(а):Добрый день.
Стоит задача написать запрос, который возвращал бы id тарифного плана, который был у пользователя в заданном (например, предыдущем) расчетном периоде.
В таблице tariffs_history хранится информация только о первом привязанном тарифном плане.
В таблице account_tariff_link подобной информации нет, поскольку при смене тарифного плана модифицируется уже существующая запись пользователя, т.е. есть информация только о текущем тарифном плане.
Кто-нибудь решал такую задачу?
Взять из invoices ?

Фейко
Сообщения: 3
Зарегистрирован: Пт авг 23, 2019 13:03

Re: История тарифных планов

Сообщение Фейко »

Тоже потребовалось такое.
Вот запрос, но нужно его подправить.

Код: Выделить всё

SELECT atl.account_id, atl.tariff_id, GROUP_CONCAT( CONVERT( CONVERT( tar.name USING BINARY ) USING UTF8 ) SEPARATOR  ', ' ) AS list_tariff, FROM_UNIXTIME( atl.link_date ) AS modify_date, (SELECT atl2.is_deleted FROM account_tariff_link as atl2 WHERE atl2.is_deleted=0 AND atl2.account_id=acc.id) as is_deleted, DATE_FORMAT(FROM_UNIXTIME(atl.link_date), '%m %Y') AS month_date, COUNT( atl.id ) AS count_tariff, (SELECT COUNT( DISTINCT th.tariff_id ) FROM tariffs_history AS th WHERE th.account_id = acc.id GROUP BY th.account_id ) AS first_connect
FROM accounts AS acc
LEFT JOIN  `account_tariff_link` AS atl ON acc.id = atl.account_id
INNER JOIN tariffs AS tar ON tar.id = atl.tariff_id
WHERE atl.link_date >=1564617600
GROUP BY acc.id
ORDER BY atl.link_date ASC, atl.account_id ASC
В выдаче текущий тариф, список тарифов, которые были подключены (list_tariff)
modify_date - дата изменения
is_deleted - Null если текущий тариф удален на Лиц. счету или 0 если тариф активен
month_date - месяц/год
count_tariff - кол-во тарифов, которое имел ЛС
first_connect - первый тариф или смена тарифа

Как по выборке понять, что это первый тариф на ЛС: тут count_tariff=1, first_connect = Null или 1
1564617600 - это 1е число нужного месяца

Запрос получается тяжеловат и нагружает БД. Есть идеи как его облегчить? Может даже разбить на отдельные подзапросы с временными таблицами.

Ответить