plechev

rcl_query

Aug 20th, 2020 (edited)
119
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*старый порядок*/
  2. $courses             = new OCS_Company_Courses();
  3. $creators            = new WPUsers();
  4. $access              = new OCS_WAU_Access();
  5. $learnAccess         = new OCS_Product_Access();
  6. $sections            = new OCS_Sections();
  7. $modules             = new OCS_Modules();
  8.  
  9. $args = array(
  10.     'post_type'          => 'courses',
  11.     'post_status__in'    => isset( $_REQUEST['course_status'] ) ? $_REQUEST['course_status'] : null,
  12.     'post_title__like'   => isset( $_REQUEST['course_name'] ) ? $_REQUEST['course_name'] : null,
  13.     'ID'                 => isset( $_REQUEST['course_id'] ) && $_REQUEST['course_id'] ? $_REQUEST['course_id'] : null,
  14.     'offset'             => $this->pager->offset,
  15.     'number'             => $this->pager->number,
  16.     'groupby'            => 'posts.ID',
  17.     'fields'             => array(
  18.         'post_title'     => array(
  19.             'as' => 'course_name'
  20.         ),
  21.         'ID'             => array(
  22.             'as' => 'course_id'
  23.         ),
  24.         'post_status'    => array(
  25.             'as' => 'course_status'
  26.         )
  27.     ),
  28.     'join_query'         => array(
  29.         array(
  30.             'table'      => $courses->query['table'],
  31.             'on_ID'      => 'course_id',
  32.             'join'       => 'LEFT',
  33.             'fields'     => array(
  34.                 //'course_id'        => 'course_id',
  35.                 'company_id'     => 'company_id',
  36.                 'custom_query'   => array(
  37.                     '('
  38.                     . 'SELECT COUNT( DISTINCT ' . $modules->query['table']['as'] . '.module_id) '
  39.                     . 'FROM ' . $modules->query['table']['name'] . ' AS ' . $modules->query['table']['as'] . ' '
  40.                     . 'WHERE ' . $modules->query['table']['as'] . '.section_id IN ('
  41.                     . 'SELECT section_id FROM ' . $sections->query['table']['name'] . ' '
  42.                     . 'WHERE ' . $sections->query['table']['name'] . '.course_id =  ' . $courses->query['table']['as'] . '.course_id'
  43.                     . ')'
  44.                     . ') AS modules_count',
  45.                     '(SELECT COUNT(DISTINCT user_id) '
  46.                     . 'FROM ' . $learnAccessLearn->query['table']['name'] . ' '
  47.                     . 'WHERE ' . $learnAccessLearn->query['table']['name'] . '.course_id =  ' . $courses->query['table']['as'] . '.course_id '
  48.                     . 'AND access_status = "1" '
  49.                     . 'AND progress IN ("wait","work")) as members_learn',
  50.                     '(SELECT COUNT(DISTINCT user_id) '
  51.                     . 'FROM ' . $learnAccessLearn->query['table']['name'] . ' '
  52.                     . 'WHERE ' . $learnAccessLearn->query['table']['name'] . '.course_id =  ' . $courses->query['table']['as'] . '.course_id '
  53.                     . 'AND progress = "course_end") as members_end'
  54.                 )
  55.             ),
  56.             'join_query' => array(
  57.                 array(
  58.                     'table'              => $creators->query['table'],
  59.                     'on_company_id'      => 'ID',
  60.                     'join'               => 'LEFT',
  61.                     'user_email__like'   => isset( $_REQUEST['creator_email'] ) ? $_REQUEST['creator_email'] : null,
  62.                     'fields'             => array(
  63.                         'user_email' => array(
  64.                             'as' => 'creator_email'
  65.                         )
  66.                     )
  67.                 ),
  68.                 array(
  69.                     'table'          => $access->query['table'],
  70.                     'join'           => 'LEFT',
  71.                     'on_company_id'  => 'user_id',
  72.                     'end_status__in' => isset( $_REQUEST['account_status'] ) ? $_REQUEST['account_status'] : null,
  73.                     'fields'         => array(
  74.                         'end_status' => array(
  75.                             'as' => 'account_status'
  76.                         )
  77.                     )
  78.                 ),
  79.                 array(
  80.                     'table'          => $sections->query['table'],
  81.                     'on_course_id'   => 'course_id',
  82.                     'join'           => 'LEFT',
  83.                     'fields'         => false
  84.                 ),
  85.                 array(
  86.                     'join'           => 'LEFT',
  87.                     'table'          => $learnAccess->query['table'],
  88.                     'on_course_id'   => 'course_id',
  89.                     'fields'         => array(
  90.                         'custom_query' => array(
  91.                             'COUNT(DISTINCT ' . $learnAccess->query['table']['as'] . '.user_id) as members_all'
  92.                         )
  93.                     )
  94.                 )
  95.             )
  96.         )
  97.     )
  98. );
  99.  
  100. $posts->set_query( $args );
  101.  
  102. if ( isset( $_REQUEST['modules_count'] ) ) {
  103.     $posts->query['having'][] = "modules_count BETWEEN '" . $_REQUEST['modules_count'][0] . "' AND '" . $_REQUEST['modules_count'][1] . "'";
  104. }
  105.  
  106. if ( isset( $_REQUEST['members_all'] ) ) {
  107.     $posts->query['having'][] = "members_all BETWEEN '" . $_REQUEST['members_all'][0] . "' AND '" . $_REQUEST['members_all'][1] . "'";
  108. }
  109.  
  110. if ( $this->orderby )
  111.     $posts->query['orderby'] = $this->orderby;
  112.  
  113. $posts->query['order'] = $this->order;
  114.  
  115. return $posts;
  116.  
  117. /*новый порядок*/
  118. $courses             = new OCS_Company_Courses();
  119.  
  120. $query = RQ::tbl( new WPPosts() )
  121.     ->select( [
  122.         'course_name'    => 'post_title',
  123.         'course_id'      => 'ID',
  124.         'course_status'  => 'post_status',
  125.     ] )
  126.     ->join(
  127.         [ 'ID', 'course_id', 'LEFT' ], RQ::tbl( $courses )
  128.         ->select( [
  129.             'company_id'     => 'company_id',
  130.             'modules_count'  => RQ::tbl( new OCS_Modules() )
  131.             ->distinct( ['count' => ['module_id' ] ] )
  132.             ->where( [
  133.                 'section_id__in' => RQ::tbl( new OCS_Sections() )->select( ['section_id' ] )->where( array(
  134.                     'course_id' => $courses->get_colname( 'course_id' )
  135.                 ) )
  136.             ] ),
  137.             'members_learn'  => RQ::tbl( new OCS_Product_Access( 'access1' ) )
  138.             ->distinct( ['count' => [ 'user_id' ] ] )
  139.             ->where( [
  140.                 'course_id'      => $courses->get_colname( 'course_id' ),
  141.                 'access_status'  => 1,
  142.                 'progress__in'   => ['wait', 'work' ]
  143.             ] ),
  144.             'members_end'    => RQ::tbl( new OCS_Product_Access( 'access2' ) )
  145.             ->distinct( ['count' => [ 'user_id' ] ] )
  146.             ->where( [
  147.                 'course_id'  => $courses->get_colname( 'course_id' ),
  148.                 'progress'   => 'course_end'
  149.             ] )
  150.         ] )
  151.         ->join(
  152.             ['company_id', 'ID', 'LEFT' ], RQ::tbl( new WPUsers() )
  153.             ->select( ['creator_email' => 'user_email' ] )
  154.             ->where( ['user_email__like' => isset( $_REQUEST['creator_email'] ) ? $_REQUEST['creator_email'] : null ] )
  155.         )
  156.         ->join(
  157.             ['company_id', 'user_id', 'LEFT' ], RQ::tbl( new OCS_WAU_Access() )
  158.             ->select( ['account_status' => 'end_status' ] )
  159.             ->where( ['end_status__in' => isset( $_REQUEST['account_status'] ) ? $_REQUEST['account_status'] : null ] )
  160.         )
  161.         ->join(
  162.             ['course_id', 'course_id', 'LEFT' ], RQ::tbl( new OCS_Sections() )
  163.         )
  164.         ->join(
  165.             ['course_id', 'course_id', 'LEFT' ], RQ::tbl( new OCS_Product_Access( 'access3' ) )
  166.             ->distinct( ['count' => ['members_all' => 'user_id' ] ] )
  167.         )
  168.     )->where( [
  169.         'post_type'          => 'courses',
  170.         'post_status__in'    => isset( $_REQUEST['course_status'] ) ? $_REQUEST['course_status'] : null,
  171.         'post_title__like'   => isset( $_REQUEST['course_name'] ) ? $_REQUEST['course_name'] : null,
  172.         'ID'                 => isset( $_REQUEST['course_id'] ) && $_REQUEST['course_id'] ? $_REQUEST['course_id'] : null,
  173.     ] )
  174.     ->groupby( 'posts.ID' )
  175.     ->orderby( $this->orderby ? $this->orderby : 'ID', $this->order )
  176.     ->limit( $this->pager->number, $this->pager->offset );
  177.  
  178. if ( isset( $_REQUEST['modules_count'] ) ) {
  179.     $query->add_having( "modules_count BETWEEN '" . $_REQUEST['modules_count'][0] . "' AND '" . $_REQUEST['modules_count'][1] . "'" );
  180. }
  181.  
  182. if ( isset( $_REQUEST['members_all'] ) ) {
  183.     $query->add_having( "members_all BETWEEN '" . $_REQUEST['members_all'][0] . "' AND '" . $_REQUEST['members_all'][1] . "'" );
  184. }
  185.  
  186. return $query;
  187.  
  188. /*результат*/
  189. SELECT posts.post_title AS course_name, posts.ID AS course_id, posts.post_status AS course_status, ocs_companies_courses.company_id AS company_id, (SELECT COUNT( DISTINCT ocs_modules.module_id) FROM cms_wp_rcl_ocs_modules AS ocs_modules WHERE ocs_modules.section_id IN (SELECT ocs_sections.section_id FROM cms_wp_rcl_ocs_sections AS ocs_sections WHERE ocs_sections.course_id = ocs_companies_courses.course_id)) AS modules_count, (SELECT COUNT( DISTINCT access1.user_id) FROM cms_wp_rcl_ocs_product_access AS access1 WHERE access1.course_id = ocs_companies_courses.course_id AND access1.access_status = '1' AND access1.progress IN ('wait','work')) AS members_learn, (SELECT COUNT( DISTINCT access2.user_id) FROM cms_wp_rcl_ocs_product_access AS access2 WHERE access2.course_id = ocs_companies_courses.course_id AND access2.progress = 'course_end') AS members_end, users.user_email AS creator_email, ocs_wau_access.end_status AS account_status, COUNT( DISTINCT access3.user_id) AS members_all FROM cms_wp_posts AS posts LEFT JOIN cms_wp_rcl_ocs_companies_courses AS ocs_companies_courses ON posts.ID = ocs_companies_courses.course_id LEFT JOIN cms_wp_users AS users ON ocs_companies_courses.company_id = users.ID LEFT JOIN cms_wp_rcl_ocs_wau_access AS ocs_wau_access ON ocs_companies_courses.company_id = ocs_wau_access.user_id LEFT JOIN cms_wp_rcl_ocs_sections AS ocs_sections ON ocs_companies_courses.course_id = ocs_sections.course_id LEFT JOIN cms_wp_rcl_ocs_product_access AS access3 ON ocs_companies_courses.course_id = access3.course_id WHERE posts.post_type = 'courses' GROUP BY posts.ID ORDER BY posts.ID DESC LIMIT 0,30
RAW Paste Data