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`

Как можно выполнить / запустить это табличное представление выше (после того, как тест был обновлен данными ранга), и как затем обновить запись соответствующими данными ведущего столбца из представления?

0 ответов

Другие вопросы по тегам