BomAle Posted February 23, 2017 Share Posted February 23, 2017 I having issue when try to join 3+ \IPS\Db\Select to a subquery... $join[] = [ \IPS\Db::i()->select( ... ), \IPS\Poll\Vote::$databaseTable .'.'. \IPS\Poll\Vote::$databasePrefix . 'poll=core_polls.pid'] ; $join[] = array(\IPS\Db::i()->select( ... ), $class::$databaseTable . '.' . $class::$databasePrefix . $class::$databaseColumnMap['poll'] . '=core_polls.pid'); $join[] = array(\IPS\Db::i()->select( ... ), $class::$databaseTable . '.' . $class::$databasePrefix . $class::$databaseColumnMap['poll'] . '=core_polls.pid'); $subquery = \IPS\Db::i()->select( $select, 'core_polls',$where); foreach ( $join as $j ) { $subquery->join( $j[0], $j[1]); } $query = \IPS\Db::i()->select( '*', $subquery, $wherealias, $sortBy, [ $offset, $this->limit ], NULL, NULL, \IPS\Db::SELECT_SQL_CALC_FOUND_ROWS); the result expected must be: SELECT SQL_CALC_FOUND_ROWS * FROM (SELECT core_polls.*, voted, .... AS item_class, .... AS item_id, .... AS item_perm FROM `core_polls` LEFT JOIN (SELECT ..... FROM `forums_topics` LEFT JOIN `core_permission_index` ON core_permission_index.app = 'forums' AND core_permission_index.perm_type = 'forum' AND core_permission_index.perm_type_id = forums_topics.forum_id) AS `forums_topics` ON forums_topics.poll_state = core_polls.pid LEFT JOIN (SELECT .... FROM `cms_custom_database_1` LEFT JOIN `core_permission_index` ON core_permission_index.app = 'cms' AND core_permission_index.perm_type = 'categories' AND core_permission_index.perm_type_id = cms_custom_database_1.category_id) AS `cms_custom_database_1` ON cms_custom_database_1.poll_state = core_polls.pid LEFT JOIN (SELECT COUNT(*) AS voted, poll FROM `core_voters` WHERE member_id = 1 GROUP BY `member_id`, `poll`) AS `core_voters` ON core_voters.poll = core_polls.pid) AS `618a598a42b4749ec66919735ac00416` WHERE poll_closed = FALSE AND poll_question LIKE '%%' AND (item_class IN ('IPS\\forums\\Topic', 'IPS\\cms\\Records1')) AND voted IS NOT NULL AND item_perm != 'NO' AND CHAR_LENGTH(item_id) >= 1 AND CHAR_LENGTH(item_class) > 1 ORDER BY start_date DESC LIMIT 0, 4 actual result: SELECT SQL_CALC_FOUND_ROWS * FROM (SELECT core_polls.*, voted, ... AS item_class, ... AS item_id, ... AS item_perm FROM `core_polls` LEFT JOIN (SELECT COUNT(*) AS voted, poll FROM `core_voters` LEFT JOIN (SELECT ... FROM `forums_topics` LEFT JOIN `core_permission_index` ON core_permission_index.app = 'forums' AND core_permission_index.perm_type = 'forum' AND core_permission_index.perm_type_id = forums_topics.forum_id) AS `forums_topics` ON forums_topics.poll_state = core_polls.pid LEFT JOIN (SELECT ... FROM `cms_custom_database_1` LEFT JOIN `core_permission_index` ON core_permission_index.app = 'cms' AND core_permission_index.perm_type = 'categories' AND core_permission_index.perm_type_id = cms_custom_database_1.category_id) AS `cms_custom_database_1` ON cms_custom_database_1.poll_state = core_polls.pid WHERE member_id = 1 GROUP BY `member_id`, `poll`) AS `core_voters` ON core_voters.poll = core_polls.pid) AS `618a598a42b4749ec66919735ac00416` WHERE poll_closed = FALSE AND poll_question LIKE '%%' AND (item_class IN ('IPS\\forums\\Topic', 'IPS\\cms\\Records1')) AND voted IS NOT NULL AND item_perm != 'NO' AND CHAR_LENGTH(item_id) >= 1 AND CHAR_LENGTH(item_class) > 1 ORDER BY start_date DESC LIMIT 0, 4 Anyone could help me to make this code work? EDIT: i remember @Colonel_mortis on this bug it still seems suspicious ( See WHERE member_id = 1.. and this regex (WHERE|GROUP BY|HAVING|LIMIT|ORDER BY|$) on \IPS\Db\Select::join() ) @Andy Millne this topic is refered to this bug Link to comment Share on other sites More sharing options...
BomAle Posted February 23, 2017 Author Share Posted February 23, 2017 I have solved with: foreach ( array_reverse($join) as $j ) but is not the solution Link to comment Share on other sites More sharing options...
BomAle Posted March 2, 2017 Author Share Posted March 2, 2017 @bfarber @Mark Link to comment Share on other sites More sharing options...
bfarber Posted March 3, 2017 Share Posted March 3, 2017 Can you create an example we can reproduce with using core tables out of the software? i.e. a little standalone script just so we can isolate and see the error? <?php require 'init.php'; \IPS\Dispatcher\External::i(); // Example DB select object with table joins go here Link to comment Share on other sites More sharing options...
BomAle Posted March 3, 2017 Author Share Posted March 3, 2017 <?php require 'init.php'; \IPS\Dispatcher\External::i(); $subquery = \IPS\Db::i()->select( '*, voted, last_vote', 'core_polls'); $subquery->join( \IPS\Db::i()->select( 'COUNT(*) as voted, poll', \IPS\Poll\Vote::$databaseTable, array("member_id=?",\IPS\Member::loggedIn()->member_id), NULL,NULL,array('member_id', 'poll'),NULL,4), \IPS\Poll\Vote::$databaseTable .'.'. \IPS\Poll\Vote::$databasePrefix . 'poll=core_polls.pid'); $subquery->join( \IPS\Db::i()->select( 'MAX(vote_date) as last_vote, poll', [\IPS\Poll\Vote::$databaseTable,'copy_'.\IPS\Poll\Vote::$databaseTable], NULL, NULL,NULL,array('poll'),NULL,4), 'copy_'.\IPS\Poll\Vote::$databaseTable .'.'. \IPS\Poll\Vote::$databasePrefix . 'poll=core_polls.pid' ); print_r($subquery->query);exit; Try also replace: array("member_id=?",\IPS\Member::loggedIn()->member_id) with: NULL ... and see that join is appended to group clause inside the first join and not into main query. I think is this code the cause $this->query = preg_replace( '/(WHERE|GROUP BY|HAVING|LIMIT|ORDER BY|$)/', $query . ' $1', $this->query, 1 ); Link to comment Share on other sites More sharing options...
bfarber Posted March 8, 2017 Share Posted March 8, 2017 Thanks. I've raised the bug report internally, and we will prioritize it and investigate it for a future release. Link to comment Share on other sites More sharing options...
BomAle Posted March 8, 2017 Author Share Posted March 8, 2017 thanks bfarber for support Link to comment Share on other sites More sharing options...
BomAle Posted May 6, 2017 Author Share Posted May 6, 2017 This will fix for 4.2 @bfarber ? Link to comment Share on other sites More sharing options...
bfarber Posted May 8, 2017 Share Posted May 8, 2017 Yes Link to comment Share on other sites More sharing options...
BomAle Posted May 8, 2017 Author Share Posted May 8, 2017 thanks you i will test ? Link to comment Share on other sites More sharing options...
BomAle Posted July 18, 2017 Author Share Posted July 18, 2017 Anyone with 4.2 beta could test this? Link to comment Share on other sites More sharing options...
BomAle Posted July 22, 2017 Author Share Posted July 22, 2017 Confirm it work many thanks for this update Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.