Добрый день.
Стоит задача написать запрос, который возвращал бы id тарифного плана, который был у пользователя в заданном (например, предыдущем) расчетном периоде.
В таблице tariffs_history хранится информация только о первом привязанном тарифном плане.
В таблице account_tariff_link подобной информации нет, поскольку при смене тарифного плана модифицируется уже существующая запись пользователя, т.е. есть информация только о текущем тарифном плане.
Кто-нибудь решал такую задачу?
История тарифных планов
-
- Сообщения: 1612
- Зарегистрирован: Пт ноя 10, 2006 15:23
Re: История тарифных планов
Взять из invoices ?link писал(а):Добрый день.
Стоит задача написать запрос, который возвращал бы id тарифного плана, который был у пользователя в заданном (например, предыдущем) расчетном периоде.
В таблице tariffs_history хранится информация только о первом привязанном тарифном плане.
В таблице account_tariff_link подобной информации нет, поскольку при смене тарифного плана модифицируется уже существующая запись пользователя, т.е. есть информация только о текущем тарифном плане.
Кто-нибудь решал такую задачу?
Re: История тарифных планов
Тоже потребовалось такое.
Вот запрос, но нужно его подправить.
В выдаче текущий тариф, список тарифов, которые были подключены (list_tariff)
modify_date - дата изменения
is_deleted - Null если текущий тариф удален на Лиц. счету или 0 если тариф активен
month_date - месяц/год
count_tariff - кол-во тарифов, которое имел ЛС
first_connect - первый тариф или смена тарифа
Как по выборке понять, что это первый тариф на ЛС: тут count_tariff=1, first_connect = Null или 1
1564617600 - это 1е число нужного месяца
Запрос получается тяжеловат и нагружает БД. Есть идеи как его облегчить? Может даже разбить на отдельные подзапросы с временными таблицами.
Вот запрос, но нужно его подправить.
Код: Выделить всё
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
modify_date - дата изменения
is_deleted - Null если текущий тариф удален на Лиц. счету или 0 если тариф активен
month_date - месяц/год
count_tariff - кол-во тарифов, которое имел ЛС
first_connect - первый тариф или смена тарифа
Как по выборке понять, что это первый тариф на ЛС: тут count_tariff=1, first_connect = Null или 1
1564617600 - это 1е число нужного месяца
Запрос получается тяжеловат и нагружает БД. Есть идеи как его облегчить? Может даже разбить на отдельные подзапросы с временными таблицами.