MYSQL: обновление записи таблицы запускает выполнение представления таблицы, а затем обновляет исходную запись таблицы
Следующее обновляет поле в пользовательском типе сообщения после того, как сообщение было отправлено:
function updateGlobalRanking($pieces, $is_new_item, $id ) {
global $wpdb;
$userID = get_current_user_id();
$circuitRank = $wpdb->get_var( $wpdb->prepare(
"
SELECT DRANK
FROM
(
SELECT
user_id, id,
difficulty_level,
total_score_session,
DENSE_RANK() OVER (
PARTITION BY difficulty_level
ORDER BY
total_score_session DESC
) AS DRANK
FROM
wp_pods_circuit
ORDER BY
difficulty_level DESC,
DRANK ASC
) AS basic
WHERE basic.user_id = $userID AND basic.id = $id
LIMIT 1
"
) );
$wpdb->update(
'wp_pods_circuit',
array(
'global_ranking' => $circuitRank
),
array( 'ID' => $id, 'user_id' => $userID ),
array(
'%d' // value1
),
array( '%d', '%d' )
);
return;
}
add_action('pods_api_post_save_pod_item_circuit', 'updateGlobalRanking', 10, 3);
По сути, пользовательский тип записи - это тест, для которого определяется оценка, а обновление пользовательского поля - это рейтинг этой оценки по отношению ко всем оценкам теста. Это работает.
Цель: обновить представление в викторине, указав предыдущий балл и предыдущую дату представления ПОСЛЕ того, как была отправлена последняя викторина и где обновлено настраиваемое поле рейтинга. Следующий код создает таблицу с этими двумя частями данных, используя функцию окон LEAD.
SELECT
`clt_numbered`.`id` AS `id`,
`clt_numbered`.`row_num` AS `row_num`,
`clt_numbered`.`save_timestamp` AS `save_timestamp`,
`clt_numbered`.`difficulty_level` AS `difficulty_level`,
`clt_numbered`.`user_id` AS `user_id`,
`clt_numbered`.`total_score_session` AS `total_score_session`,
`clt_numbered`.`global_ranking` AS `global_ranking`,
`clt_numbered`.`previous_global_rank` AS `previous_global_rank`,
`clt_numbered`.`previous_global_rank_date` AS `previous_global_rank_date`
FROM
(
SELECT
`circuit_lead_table`.`id`,
ROW_NUMBER() OVER (PARTITION BY `circuit_lead_table`.`difficulty_level`, `user_id` ORDER BY `circuit_lead_table`.`save_timestamp` DESC) AS `row_num`,
`circuit_lead_table`.`save_timestamp`,
`circuit_lead_table`.`difficulty_level`,
`circuit_lead_table`.`user_id`,
`circuit_lead_table`.`total_score_session`,
`circuit_lead_table`.`global_ranking`,
`circuit_lead_table`.`previous_global_rank`,
`circuit_lead_table`.`previous_global_rank_date`
FROM
(
SELECT `id`,
`save_timestamp`,
`difficulty_level`,
`user_id`,
`total_score_session`,
`global_ranking`,
LEAD(`global_ranking`) OVER (PARTITION BY `difficulty_level`, `user_id` ORDER BY `save_timestamp` DESC) AS `previous_global_rank`,
LEAD(`save_timestamp`) OVER (PARTITION BY `difficulty_level`,`user_id` ORDER BY `save_timestamp` DESC) AS `previous_global_rank_date`
FROM `wp_pods_circuit`
ORDER BY `difficulty_level`, `save_timestamp` DESC
) AS `circuit_lead_table`
) AS `clt_numbered`
WHERE `row_num` = 1
ORDER BY `user_id`
Как можно выполнить / запустить это табличное представление выше (после того, как тест был обновлен данными ранга), и как затем обновить запись соответствующими данными ведущего столбца из представления?