diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 6bae5a795..c85fae574 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -243,7 +243,7 @@ * @return result of query * @remarks this function finds xml file or cache file of $query_id, compiles it and then execute it **/ - function executeQuery($query_id, $args = NULL) { + function executeQuery($query_id, $args = NULL, $arg_columns = NULL) { if(!$query_id) return new Object(-1, 'msg_invalid_queryid'); $this->query_id = $query_id; @@ -267,7 +267,7 @@ $cache_file = $this->checkQueryCacheFile($query_id, $xml_file); // execute query - return $this->_executeQuery($cache_file, $args, $query_id); + return $this->_executeQuery($cache_file, $args, $query_id, $arg_columns); } @@ -303,7 +303,7 @@ * @param[in] $query_id query id * @return result of query **/ - function _executeQuery($cache_file, $source_args, $query_id) { + function _executeQuery($cache_file, $source_args, $query_id, $arg_columns) { global $lang; if(!file_exists($cache_file)) return new Object(-1, 'msg_invalid_queryid'); @@ -314,7 +314,7 @@ if( (is_a($output, 'Object') || is_subclass_of($output, 'Object')) && !$output->toBool()) return $output; $output->_tables = ($output->_tables && is_array($output->_tables)) ? $output->_tables : array(); - + // execute appropriate query switch($output->action) { case 'insert' : @@ -330,9 +330,11 @@ $output = $this->_executeDeleteAct($output); break; case 'select' : + $output->arg_columns = is_array($arg_columns)?$arg_columns:array(); $output = $this->_executeSelectAct($output); break; } + if($this->isError()) $output = $this->getError(); else if(!is_a($output, 'Object') && !is_subclass_of($output, 'Object')) $output = new Object(); $output->add('_query', $this->query); diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index 555cf0f88..955b33dc1 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -826,89 +826,90 @@ } } - if (!$output->columns) { - $columns = '*'; - } - else { - $column_list = array (); - foreach ($output->columns as $key => $val) { - $name = $val['name']; + if(!$output->columns) $output->columns = array('*'); - $click_count = '%s'; - if ($val['click_count'] && count ($output->conditions) > 0) { - $click_count = 'incr(%s)'; - } + $column_list = array (); + foreach ($output->columns as $key => $val) { + $name = $val['name']; - $alias = $val['alias'] ? sprintf ('"%s"', $val['alias']) : null; + $click_count = '%s'; + if ($val['click_count'] && count ($output->conditions) > 0) { + $click_count = 'incr(%s)'; + } - if ($name == '*') { - $column_list[] = $name; - } - elseif (strpos ($name, '.') === false && strpos ($name, '(') === false) { - $name = sprintf ($click_count,$name); - if ($alias) { - $column_list[] = sprintf('"%s" as %s', $name, $alias); - } - else { - $column_list[] = sprintf ('"%s"', $name); - } - } - else { - if (strpos ($name, '.') != false) { - list ($prefix, $name) = explode('.', $name); - if (($now_matchs = preg_match_all ("/\(/", $prefix, $xtmp)) > 0) { - if ($now_matchs == 1) { - $tmpval = explode ("(", $prefix); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $prefix = implode ("(", $tmpval); - $tmpval = explode (")", $name); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $name = implode (")", $tmpval); - } - } - else { - $prefix = sprintf ('"%s"', $prefix); - $name = ($name == '*') ? $name : sprintf('"%s"',$name); - } - $xtmp = null; - $now_matchs = null; - $column_list[] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)) . ($alias ? sprintf (' as %s',$alias) : ''); - } - elseif (($now_matchs = preg_match_all ("/\(/", $name, $xtmp)) > 0) { - if ($now_matchs == 1 && preg_match ("/[a-zA-Z0-9]*\(\*\)/", $name) < 1) { - $open_pos = strpos ($name, "("); - $close_pos = strpos ($name, ")"); + $alias = $val['alias'] ? sprintf ('"%s"', $val['alias']) : null; - if (preg_match ("/,/", $name)) { - $tmp_func_name = sprintf ('%s', substr ($name, 0, $open_pos)); - $tmp_params = sprintf ('%s', substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); - $tmpval = null; - $tmpval = explode (',', $tmp_params); + if ($name == '*') { + $column_list[] = $name; + } + elseif (strpos ($name, '.') === false && strpos ($name, '(') === false) { + $name = sprintf ($click_count,$name); + if ($alias) { + $column_list[$alias] = sprintf('"%s" as %s', $name, $alias); + } + else { + $column_list[] = sprintf ('"%s"', $name); + } + } + else { + if (strpos ($name, '.') != false) { + list ($prefix, $name) = explode('.', $name); + if (($now_matchs = preg_match_all ("/\(/", $prefix, $xtmp)) > 0) { + if ($now_matchs == 1) { + $tmpval = explode ("(", $prefix); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $prefix = implode ("(", $tmpval); + $tmpval = explode (")", $name); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $name = implode (")", $tmpval); + } + } + else { + $prefix = sprintf ('"%s"', $prefix); + $name = ($name == '*') ? $name : sprintf('"%s"',$name); + } + $xtmp = null; + $now_matchs = null; + if($alias) $column_list[$val['alias]']] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)) . ($alias ? sprintf (' as %s',$alias) : ''); + else $column_list[] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)); + } + elseif (($now_matchs = preg_match_all ("/\(/", $name, $xtmp)) > 0) { + if ($now_matchs == 1 && preg_match ("/[a-zA-Z0-9]*\(\*\)/", $name) < 1) { + $open_pos = strpos ($name, "("); + $close_pos = strpos ($name, ")"); - foreach ($tmpval as $tmp_param) { - $tmp_param_list[] = (!is_numeric ($tmp_param)) ? sprintf ('"%s"', $tmp_param) : $tmp_param; - } + if (preg_match ("/,/", $name)) { + $tmp_func_name = sprintf ('%s', substr ($name, 0, $open_pos)); + $tmp_params = sprintf ('%s', substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); + $tmpval = null; + $tmpval = explode (',', $tmp_params); - $tmpval = implode (',', $tmp_param_list); - $name = sprintf ('%s(%s)', $tmp_func_name, $tmpval); - } - else { - $name = sprintf ('%s("%s")', substr ($name, 0, $open_pos), substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); - } - } + foreach ($tmpval as $tmp_param) { + $tmp_param_list[] = (!is_numeric ($tmp_param)) ? sprintf ('"%s"', $tmp_param) : $tmp_param; + } - $column_list[] = sprintf ($click_count, $name). ($alias ? sprintf (' as %s', $alias) : ''); - } - else { - $column_list[] = sprintf($click_count, $name). ($alias ? sprintf(' as %s',$alias) : ''); - } - } - } + $tmpval = implode (',', $tmp_param_list); + $name = sprintf ('%s(%s)', $tmp_func_name, $tmpval); + } + else { + $name = sprintf ('%s("%s")', substr ($name, 0, $open_pos), substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); + } + } + + if($alias) $column_list[$val['alias']] = sprintf ($click_count, $name). ($alias ? sprintf (' as %s', $alias) : ''); + else $column_list[] = sprintf ($click_count, $name); + } + else { + if($alias) $column_list[$val['alias']] = sprintf($click_count, $name). ($alias ? sprintf(' as %s',$alias) : ''); + else $column_list[] = sprintf($click_count, $name); + } + } $columns = implode (',', $column_list); } $condition = $this->getCondition ($output); + $output->column_list = $column_list; if ($output->list_count && $output->page) { return ($this->_getNavigationData($table_list, $columns, $left_join, $condition, $output)); } @@ -925,7 +926,6 @@ //} } - $query = sprintf ("select %s from %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition); if (count ($output->groups)) { foreach ($output->groups as $key => $value) { @@ -942,10 +942,17 @@ $value = sprintf ('"%s"', $value); } $output->groups[$key] = $value; + + + if(count($output->arg_columns)) + { + if($column_list[$value]) $output->arg_columns[] = $column_list[$value]; + } } - $query .= sprintf (' group by %s', implode(',', $output->groups)); + $gourpby_query = sprintf ('group by %s', implode(',', $output->groups)); } + // list_count를 사용할 경우 적용 if ($output->list_count['value']) { $start_count = 0; @@ -965,19 +972,19 @@ $index_list[] = sprintf('%s %s', $val[0], $val[1]); } if (count($index_list)) - $query .= ' order by '.implode(',', $index_list); - $query = sprintf ('%s for orderby_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count); + $orderby_query = ' order by '.implode(',', $index_list); + $orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); } else { if (count ($output->groups)) { - $query = sprintf ('%s having groupby_num() between %d'. ' and %d', $query, $start_count + 1, $list_count + $start_count); + $orderby_query = sprintf ('%s having groupby_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); } else { if ($condition) { - $query = sprintf ('%s and inst_num() between %d'. ' and %d', $query, $start_count + 1, $list_count + $start_count); + $orderby_query = sprintf ('%s and inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); } else { - $query = sprintf ('%s where inst_num() between %d'. ' and %d', $query, $start_count + 1, $list_count + $start_count); + $orderby_query = sprintf ('%s where inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); } } } @@ -995,14 +1002,23 @@ elseif ($val[0] == 'count') $val[0] = 'count (*)'; else $val[0] = sprintf ('"%s"', $val[0]); $index_list[] = sprintf('%s %s', $val[0], $val[1]); + + if(count($output->arg_columns) && $column_list[$val]) $output->arg_columns[] = $column_list[$key]; } if (count ($index_list)) { - $query .= ' order by '.implode(',', $index_list); + $orderby_query = ' order by '.implode(',', $index_list); } } } + if(count($output->arg_columns)) + { + $columns = '"' . join('","',$output->arg_columns) . '"'; + } + + $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query); + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; $result = $this->_query ($query); if ($this->isError ()) return; @@ -1074,20 +1090,18 @@ function _getNavigationData ($table_list, $columns, $left_join, $condition, $output) { require_once (_XE_PATH_.'classes/page/PageHandler.class.php'); - $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; - $total_count = $this->getCountCache($output->tables, $count_condition); - if ($total_count === false) { - $count_query = sprintf('select count(*) as "count" from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition); - if (count($output->groups)) { - $count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query); - } + $column_list = $output->column_list; - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; - $this->putCountCache($output->tables, $count_condition, $total_count); - } + $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; + $count_query = sprintf('select count(*) as "count" from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition); + if (count($output->groups)) { + $count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query); + } + + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; $list_count = $output->list_count['value']; if (!$list_count) $list_count = 20; @@ -1120,7 +1134,6 @@ //} } - $query = sprintf ("select %s from %s %s %s", $columns, implode (',', $table_list), implode(' ', $left_join), $condition); if (count ($output->groups)) { foreach ($output->groups as $key => $value) { @@ -1135,7 +1148,7 @@ $output->groups[$key] = $value; } - $query .= sprintf (' group by %s', implode (',', $output->groups)); + $groupby_query = sprintf (' group by %s', implode (',', $output->groups)); } if ($output->order) { @@ -1153,25 +1166,31 @@ } if (count ($index_list)) { - $query .= ' order by '.implode(',', $index_list); + $orderby_query = ' order by '.implode(',', $index_list); } - $query = sprintf ('%s for orderby_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count); + $orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); } else { if (count($output->groups)) { - $query = sprintf ('%s having groupby_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count); + $orderby_query = sprintf ('%s having groupby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); } else { if ($condition) { - $query = sprintf ('%s and inst_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count); + $orderby_query = sprintf ('%s and inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); } else { - $query = sprintf('%s where inst_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count); + $orderby_query = sprintf('%s where inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); } } } + if(count($output->arg_columns)) + { + $columns = '"' . join('","',$output->arg_columns) . '"'; + } + + $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query); $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; $result = $this->_query ($query); diff --git a/classes/db/DBFirebird.class.php b/classes/db/DBFirebird.class.php index 5cf3ef06e..1b48a1dbc 100644 --- a/classes/db/DBFirebird.class.php +++ b/classes/db/DBFirebird.class.php @@ -822,13 +822,14 @@ if($alias == "") $column_list[] = $this->autoQuotes($name); else - $column_list[] = sprintf("%s as \"%s\"", $this->autoQuotes($name), $alias); + $column_list[$alias] = sprintf("%s as \"%s\"", $this->autoQuotes($name), $alias); } $columns = implode(',',$column_list); } $condition = $this->getCondition($output); + $output->column_list = $column_list; if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 @@ -848,24 +849,29 @@ if($output->list_count['value']) $limit = sprintf('FIRST %d', $output->list_count['value']); else $limit = ''; - $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition); if($output->groups) { foreach($output->groups as $key => $val) { $group_list[] = $this->autoQuotes($val); + if($column_list[$val]) $output->arg_columns[] = $column_list[$val]; } - if(count($group_list)) $query .= sprintf(" group by %s", implode(",",$group_list)); + if(count($group_list)) $groupby_query = sprintf(" group by %s", implode(",",$group_list)); } if($output->order) { foreach($output->order as $key => $val) { $index_list[] = sprintf("%s %s", $this->autoQuotes($val[0]), $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; } - if(count($index_list)) $query .= sprintf(" order by %s", implode(",",$index_list)); + if(count($index_list)) $orderby_query = sprintf(" order by %s", implode(",",$index_list)); } + if(count($output->arg_columns)) + { + $columns = '"' . join('","',$output->arg_columns) . '"'; + } + $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query); $query .= ";"; - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; $result = $this->_query($query); if($this->isError()) { @@ -896,10 +902,14 @@ function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); + $column_list = $output->column_list; + $query_groupby = ''; if ($output->groups) { - foreach ($output->groups as $key => $val) + foreach ($output->groups as $key => $val){ $group_list[] = $this->autoQuotes($val); + if($column_list[$val]) $output->arg_columns[] = $column_list[$val]; + } if (count($group_list)) $query_groupby = sprintf(" GROUP BY %s", implode(", ", $group_list)); } @@ -922,16 +932,12 @@ // 전체 개수를 구함 $count_query = sprintf("select count(*) as \"count\" from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition); - $total_count = $this->getCountCache($output->tables, $condition); - if($total_count === false) { - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - if(!$this->transaction_started) @ibase_commit($this->fd); + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + if(!$this->transaction_started) @ibase_commit($this->fd); - $total_count = (int)$count_output->count; - $this->putCountCache($output->tables, $condition, $total_count); - } + $total_count = (int)$count_output->count; $list_count = $output->list_count['value']; if(!$list_count) $list_count = 20; @@ -962,17 +968,17 @@ } $limit = sprintf('FIRST %d SKIP %d ', $list_count, $start_count); - $query = sprintf('SELECT %s %s FROM %s %s %s', $limit, $columns, implode(',',$table_list), implode(' ',$left_join), $condition); - if (strlen($query_groupby)) $query .= $query_groupby; if($output->order) { foreach($output->order as $key => $val) { $index_list[] = sprintf("%s %s", $this->autoQuotes($val[0]), $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; } - if(count($index_list)) $query .= sprintf(" ORDER BY %s", implode(",",$index_list)); + if(count($index_list)) $orderby_query = sprintf(" ORDER BY %s", implode(",",$index_list)); } + $query = sprintf('SELECT %s %s FROM %s %s %s, %s', $limit, $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $groupby_query.$orderby_query); $query .= ";"; $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; $result = $this->_query($query); diff --git a/classes/db/DBMssql.class.php b/classes/db/DBMssql.class.php index 10b7e863d..7cb1d74b1 100644 --- a/classes/db/DBMssql.class.php +++ b/classes/db/DBMssql.class.php @@ -639,31 +639,29 @@ } } - if(!$output->columns) { - $columns = '*'; - } else { - $column_list = array(); - foreach($output->columns as $key => $val) { - $name = $val['name']; - if(preg_match('/^substr\(/i',$name)) $name = preg_replace('/^substr\(/i','substring(',$name); - $alias = $val['alias']; - if($val['click_count']) $click_count[] = $val['name']; + if(!$output->columns) $output->columns = array('*'); + $column_list = array(); + foreach($output->columns as $key => $val) { + $name = $val['name']; + if(preg_match('/^substr\(/i',$name)) $name = preg_replace('/^substr\(/i','substring(',$name); + $alias = $val['alias']; + if($val['click_count']) $click_count[] = $val['name']; - if(substr($name,-1) == '*') { - $column_list[] = $name; - } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { - if($alias) $column_list[] = sprintf('[%s] as [%s]', $name, $alias); - else $column_list[] = sprintf('[%s]',$name); - } else { - if($alias) $column_list[] = sprintf('%s as [%s]', $name, $alias); - else $column_list[] = sprintf('%s',$name); - } - } - $columns = implode(',',$column_list); - } + if(substr($name,-1) == '*') { + $column_list[] = $name; + } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { + if($alias) $column_list[$alias] = sprintf('[%s] as [%s]', $name, $alias); + else $column_list[] = sprintf('[%s]',$name); + } else { + if($alias) $column_list[$alias] = sprintf('%s as [%s]', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } + } + $columns = implode(',',$column_list); $condition = $this->getCondition($output); + $output->column_list = $column_list; if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 @@ -679,26 +677,29 @@ } } - $query = sprintf("%s from %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition); - if(count($output->groups)){ foreach($output->groups as $k => $v ){ if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v); + if($column_list[$v]) $output->arg_columns[] = $column_list[$v]; } - $query .= sprintf(' group by %s', implode(',',$output->groups)); + $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); } - - - if($output->order && !preg_match('/count\(\*\)/i',$columns) ) { foreach($output->order as $key => $val) { if(preg_match('/^substr\(/i',$val[0])) $name = preg_replace('/^substr\(/i','substring(',$val[0]); $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; } - if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list); } + if(count($output->arg_columns)) + { + $columns = '[' . join('],[',$output->arg_columns) . ']'; + } + + $query = sprintf("%s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query); // list_count를 사용할 경우 적용 if($output->list_count['value']) $query = sprintf('select top %d %s', $output->list_count['value'], $query); else $query = "select ".$query; @@ -729,33 +730,31 @@ function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); + $column_list = $output->column_list; + // 전체 개수를 구함 if(count($output->groups)){ foreach($output->groups as $k => $v ){ if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v); + if($column_list[$v]) $output->arg_columns[] = $column_list[$v]; } $count_condition = sprintf('%s group by %s', $condition, implode(', ', $output->groups)); }else{ $count_condition = $condition; } - - $total_count = $this->getCountCache($output->tables, $count_condition); - if($total_count === false) { - $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); - if (count($output->groups)) $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); - - $param = $this->param; + $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); + if (count($output->groups)) $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); + + $param = $this->param; - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; - $result = $this->_query($count_query); - - $this->param = $param; - $count_output = $this->_fetch($result); + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; + $result = $this->_query($count_query); + + $this->param = $param; + $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; - $this->putCountCache($output->tables, $count_condition, $total_count); - } + $total_count = (int)$count_output->count; $list_count = $output->list_count['value']; if(!$list_count) $list_count = 20; @@ -785,13 +784,14 @@ } } - // group by 절 추가 if(count($output->groups)){ foreach($output->groups as $k => $v ){ if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v); + if($column_list[$v]) $output->arg_columns[] = $column_list[$v]; } - $group .= sprintf('group by %s', implode(',',$output->groups)); + + $group = sprintf('group by %s', implode(',',$output->groups)); } // order 절 추가 @@ -801,6 +801,7 @@ if(preg_match('/^substr\(/i',$val[0])) $name = preg_replace('/^substr\(/i','substring(',$val[0]); $order_targets[$val[0]] = $val[1]; $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; } if(count($index_list)) $order .= 'order by '.implode(',',$index_list); } @@ -809,6 +810,11 @@ else $order_targets['xe_seq'] = 'desc'; } + if(count($output->arg_columns)) + { + $columns = '[' . join('],[',$output->arg_columns) . ']'; + } + if($start_count<1) { $query = sprintf('select top %d %s from %s %s %s %s %s', $list_count, $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $group, $order); diff --git a/classes/db/DBMysql.class.php b/classes/db/DBMysql.class.php index c105d18f0..b3b192445 100644 --- a/classes/db/DBMysql.class.php +++ b/classes/db/DBMysql.class.php @@ -525,36 +525,56 @@ $left_join = array(); // why??? $left_tables= (array)$output->left_tables; + foreach($left_tables as $key => $val) { $condition = $this->_getCondition($output->left_conditions[$key],$output->column_type); if($condition){ $left_join[] = $val . ' `'.$this->prefix.$output->_tables[$key].'` as '.$key . ' on (' . $condition . ')'; } } - + $click_count = array(); - if(!$output->columns) { - $columns = '*'; - } else { - $column_list = array(); - foreach($output->columns as $key => $val) { - $name = $val['name']; - $alias = $val['alias']; - if($val['click_count']) $click_count[] = $val['name']; + if(!$output->columns) $output->columns = array('*'); - if(substr($name,-1) == '*') { - $column_list[] = $name; - } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { - if($alias) $column_list[] = sprintf('`%s` as `%s`', $name, $alias); - else $column_list[] = sprintf('`%s`',$name); - } else { - if($alias) $column_list[] = sprintf('%s as `%s`', $name, $alias); - else $column_list[] = sprintf('%s',$name); - } - } - $columns = implode(',',$column_list); - } + $column_list = array(); + foreach($output->columns as $key => $val) + { + $name = $val['name']; + $alias = $val['alias']; + if($val['click_count']) $click_count[] = $val['name']; + if(substr($name,-1) == '*') + { + $column_list[] = $name; + } + else if(strpos($name,'.')===false && strpos($name,'(')===false) + { + if($alias) + { + $col = sprintf('`%s` as `%s`', $name, $alias); + $column_list[$alias] = $col; + } + else + { + $column_list[] = sprintf('`%s`',$name); + } + } + else + { + if($alias) + { + $col = sprintf('%s as `%s`', $name, $alias); + $column_list[$alias] = $col; + } + else + { + $column_list[] = sprintf('%s',$name); + } + } + } + + $columns = implode(',',$column_list); + $output->column_list = $column_list; $condition = $this->getCondition($output); if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); @@ -572,17 +592,35 @@ } } - $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition); - if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + if(count($output->groups)) + { + $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); + if(count($output->arg_columns)) + { + foreach($output->groups as $group) + { + if($column_list[$group]) $output->arg_columns[] = $column_list[$group]; + } + } + } + if($output->order) { foreach($output->order as $key => $val) { $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; } - if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + if(count($index_list)) $orderby_query .= ' order by '.implode(',',$index_list); } + if(count($output->arg_columns)) + { + $columns = '`' . join('`,`',$output->arg_columns) . '`'; + } + + $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query); + // list_count를 사용할 경우 적용 if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']); @@ -591,7 +629,7 @@ $result = $this->_query($query); if($this->isError()) return; - if(count($click_count)>0 && count($output->conditions)>0){ + if(count($click_count) && count($output->conditions)){ $_query = ''; foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c); $_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition); @@ -602,6 +640,7 @@ $buff = new Object(); $buff->data = $data; + return $buff; } @@ -613,20 +652,17 @@ function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); - // 전체 개수를 구함 - $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; - $total_count = $this->getCountCache($output->tables, $count_condition); - if($total_count === false) { - $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); - if (count($output->groups)) - $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); + $column_list = $output->column_list; - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; - $this->putCountCache($output->tables, $count_condition, $total_count); - } + // 전체 개수를 구함 + $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; + $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); + if (count($output->groups)) $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); + + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; $list_count = $output->list_count['value']; if(!$list_count) $list_count = 20; @@ -656,17 +692,33 @@ } } - $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition); + if(count($output->groups)){ + $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); - if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + if(count($output->arg_columns)) + { + foreach($output->groups as $group) + { + if($column_list[$group]) $output->arg_columns[] = $column_list[$group]; + } + } + } if(count($output->order)) { foreach($output->order as $key => $val) { $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; } - if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list); } + + if(count($output->arg_columns)) + { + $columns = '`' . join('`,`',$output->arg_columns) . '`'; + } + + $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $groupby_query.$orderby_query); $query = sprintf('%s limit %d, %d', $query, $start_count, $list_count); $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; diff --git a/classes/db/DBMysql_innodb.class.php b/classes/db/DBMysql_innodb.class.php index e007dfa5c..f3587e307 100644 --- a/classes/db/DBMysql_innodb.class.php +++ b/classes/db/DBMysql_innodb.class.php @@ -567,6 +567,7 @@ $condition = $this->getCondition($output); + $output->column_list = $column_list; if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); @@ -624,20 +625,18 @@ function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); + $column_list = $output->column_list; + // 전체 개수를 구함 $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; - $total_count = $this->getCountCache($output->tables, $count_condition); - if($total_count === false) { - $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); - if (count($output->groups)) - $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); + $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); + if (count($output->groups)) + $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; - $this->putCountCache($output->tables, $count_condition, $total_count); - } + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; $list_count = $output->list_count['value']; if(!$list_count) $list_count = 20; diff --git a/classes/db/DBMysqli.class.php b/classes/db/DBMysqli.class.php index 6ae96b65e..a808db175 100644 --- a/classes/db/DBMysqli.class.php +++ b/classes/db/DBMysqli.class.php @@ -523,30 +523,29 @@ } $click_count = array(); - if(!$output->columns) { - $columns = '*'; - } else { - $column_list = array(); - foreach($output->columns as $key => $val) { - $name = $val['name']; - $alias = $val['alias']; - if($val['click_count']) $click_count[] = $val['name']; + if(!$output->columns) $output->columns = array('*'); - if(substr($name,-1) == '*') { - $column_list[] = $name; - } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { - if($alias) $column_list[] = sprintf('`%s` as `%s`', $name, $alias); - else $column_list[] = sprintf('`%s`',$name); - } else { - if($alias) $column_list[] = sprintf('%s as `%s`', $name, $alias); - else $column_list[] = sprintf('%s',$name); - } - } - $columns = implode(',',$column_list); - } + $column_list = array(); + foreach($output->columns as $key => $val) { + $name = $val['name']; + $alias = $val['alias']; + if($val['click_count']) $click_count[] = $val['name']; + + if(substr($name,-1) == '*') { + $column_list[] = $name; + } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { + if($alias) $column_list[$alias] = sprintf('`%s` as `%s`', $name, $alias); + else $column_list[] = sprintf('`%s`',$name); + } else { + if($alias) $column_list[$alias] = sprintf('%s as `%s`', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } + } + $columns = implode(',',$column_list); $condition = $this->getCondition($output); + $output->column_list = $column_list; if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 @@ -562,25 +561,45 @@ } } - $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition); - if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + if(count($output->groups)) + { + $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); + + if(count($output->arg_columns)) + { + foreach($output->groups as $group) + { + if($column_list[$group]) $output->arg_columns[] = $column_list[$group]; + } + } + } if($output->order) { foreach($output->order as $key => $val) { $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; } - if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list); } // list_count를 사용할 경우 적용 if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']); + + if(count($output->arg_columns)) + { + $columns = '`' . join('`,`',$output->arg_columns) . '`'; + } + + + $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupnby_query.$orderby_query); + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; $result = $this->_query($query); if($this->isError()) return; - if(count($click_count)>0 && count($output->conditions)>0){ + if(count($click_count) && count($output->conditions)){ $_query = ''; foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c); $_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition); @@ -602,20 +621,18 @@ function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); + $column_list = $output->column_list; + // 전체 개수를 구함 $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; - $total_count = $this->getCountCache($output->tables, $count_condition); - if($total_count === false) { - $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); - if (count($output->groups)) - $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); + $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); + if (count($output->groups)) $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; - $this->putCountCache($output->tables, $count_condition, $total_count); - } + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + $this->putCountCache($output->tables, $count_condition, $total_count); $list_count = $output->list_count['value']; if(!$list_count) $list_count = 20; @@ -644,20 +661,37 @@ } } } + + if(count($output->groups)){ + $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); - $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition); - - if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + if(count($output->arg_columns)) + { + foreach($output->groups as $group) + { + if($column_list[$group]) $output->arg_columns[] = $column_list[$group]; + } + } + } if(count($output->order)) { foreach($output->order as $key => $val) { $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; } - if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list); } + + if(count($output->arg_columns)) + { + $columns = '`' . join('`,`',$output->arg_columns) . '`'; + } + + $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $groupby_query.$orderby_query); $query = sprintf('%s limit %d, %d', $query, $start_count, $list_count); $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; + $result = $this->_query($query); if($this->isError()) { $buff = new Object(); diff --git a/classes/db/DBPostgresql.class.php b/classes/db/DBPostgresql.class.php index 317d1c2fe..6da1f54ff 100644 --- a/classes/db/DBPostgresql.class.php +++ b/classes/db/DBPostgresql.class.php @@ -682,12 +682,12 @@ class DBPostgresql extends DB $column_list[] = $name; } elseif (strpos($name, '.') === false && strpos($name, '(') === false) { if ($alias) - $column_list[] = sprintf('%s as %s', $name, $alias); + $column_list[$alias] = sprintf('%s as %s', $name, $alias); else $column_list[] = sprintf('%s', $name); } else { if ($alias) - $column_list[] = sprintf('%s as %s', $name, $alias); + $column_list[$alias] = sprintf('%s as %s', $name, $alias); else $column_list[] = sprintf('%s', $name); } @@ -697,6 +697,7 @@ class DBPostgresql extends DB $condition = $this->getCondition($output); + $output->column_list = $column_list; if ($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); @@ -717,8 +718,6 @@ class DBPostgresql extends DB } } - $query = sprintf("select %s from %s %s %s", $columns, implode(',', $table_list), - implode(' ', $left_join), $condition); if (count($output->groups)) { /* @@ -745,19 +744,27 @@ class DBPostgresql extends DB } } + if($column_list[$gval]) $output->arg_columns[] = $column_list[$gval]; + } - $query .= sprintf(' group by %s', implode(',', $group_list)); + $groupby_query = sprintf(' group by %s', implode(',', $group_list)); // var_dump($query); } if ($output->order) { foreach ($output->order as $key => $val) { $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; } - if (count($index_list)) - $query .= ' order by ' . implode(',', $index_list); + if (count($index_list)) $orderby_query = ' order by ' . implode(',', $index_list); } + if(count($output->arg_columns)) + { + $columns = join(',',$output->arg_columns); + } + + $query = sprintf("select %s from %s %s %s %s", $columns, implode(',', $table_list), implode(' ', $left_join), $condition, $groupby_query.$orderby_query); $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; $result = $this->_query($query); if ($this->isError()) @@ -787,6 +794,7 @@ class DBPostgresql extends DB { require_once (_XE_PATH_ . 'classes/page/PageHandler.class.php'); + $column_list = $output->column_list; /* // group by 절이 포함된 SELECT 쿼리의 전체 갯수를 구하기 위한 수정 // 정상적인 동작이 확인되면 주석으로 막아둔 부분으로 대체합니다. @@ -805,37 +813,26 @@ class DBPostgresql extends DB */ // 전체 개수를 구함 - $count_query = sprintf("select count(*) as count from %s %s %s", implode(',', $table_list), - implode(' ', $left_join), $condition); - $total_count = $this->getCountCache($output->tables, $condition); - if ($total_count === false) { - - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; - $this->putCountCache($output->tables, $condition, $total_count); - } + $count_query = sprintf("select count(*) as count from %s %s %s", implode(',', $table_list), implode(' ', $left_join), $condition); + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; $list_count = $output->list_count['value']; - if (!$list_count) - $list_count = 20; + if (!$list_count) $list_count = 20; $page_count = $output->page_count['value']; - if (!$page_count) - $page_count = 10; + if (!$page_count) $page_count = 10; $page = $output->page['value']; if (!$page) $page = 1; // 전체 페이지를 구함 - if ($total_count) - $total_page = (int)(($total_count - 1) / $list_count) + 1; - else - $total_page = 1; + if ($total_count) $total_page = (int)(($total_count - 1) / $list_count) + 1; + else $total_page = 1; // 페이지 변수를 체크 - if ($page > $total_page) - $page = $total_page; + if ($page > $total_page) $page = $total_page; $start_count = ($page - 1) * $list_count; // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 @@ -854,20 +851,52 @@ class DBPostgresql extends DB } } - $query = sprintf("select %s from %s %s %s", $columns, implode(',', $table_list), - implode(' ', $left_join), $condition); + if (count($output->groups)) { + /* + var_dump("= column output start = "); + var_dump(sizeof ($output->columns) . " = end length == "); + var_dump($output->columns); + var_dump("= column output end = " . "\n"); + var_dump($output->groups); + var_dump("=== " . "\n"); + var_dump(debug_backtrace()); + + foreach($output->columns as $key => $val) { + $name = $val['name']; + $alias = $val['alias']; + } */ + $group_list = array(); + foreach ($output->groups as $gkey => $gval) { + foreach ($output->columns as $key => $val) { + $name = $val['name']; + $alias = $val['alias']; + if (trim($name) == trim($gval)) { + $group_list[] = $alias; + break; + } + } - if (count($output->groups)) - $query .= sprintf(' group by %s', implode(',', $output->groups)); + if($column_list[$gval]) $output->arg_columns[] = $column_list[$gval]; - if (count($output->order)) { - foreach ($output->order as $key => $val) { - $index_list[] = sprintf('%s %s', $val[0], $val[1]); } - if (count($index_list)) - $query .= ' order by ' . implode(',', $index_list); + $groupby_query = sprintf(' group by %s', implode(',', $group_list)); + // var_dump($query); } + if ($output->order) { + foreach ($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; + } + if (count($index_list)) $orderby_query = ' order by ' . implode(',', $index_list); + } + + if(count($output->arg_columns)) + { + $columns = join(',',$output->arg_columns); + } + + $query = sprintf("select %s from %s %s %s", $columns, implode(',', $table_list), implode(' ', $left_join), $condition); $query = sprintf('%s offset %d limit %d', $query, $start_count, $list_count); $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; diff --git a/classes/db/DBSqlite2.class.php b/classes/db/DBSqlite2.class.php index b52282882..c166e492b 100644 --- a/classes/db/DBSqlite2.class.php +++ b/classes/db/DBSqlite2.class.php @@ -563,6 +563,7 @@ $condition = $this->getCondition($output); + $output->column_list = $column_list; if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 @@ -618,6 +619,7 @@ function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); + $column_list = $output->column_list; /* // group by 절이 포함된 SELECT 쿼리의 전체 갯수를 구하기 위한 수정 // 정상적인 동작이 확인되면 주석으로 막아둔 부분으로 대체합니다. @@ -637,16 +639,10 @@ // 전체 개수를 구함 $count_query = sprintf("select count(*) as count from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition); - - $total_count = $this->getCountCache($output->tables, $condition); - - if($total_count === false) { - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; - $this->putCountCache($output->tables, $condition, $total_count); - } + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; $list_count = $output->list_count['value']; if(!$list_count) $list_count = 20; diff --git a/classes/db/DBSqlite3_pdo.class.php b/classes/db/DBSqlite3_pdo.class.php index 0cced944c..e5c196631 100644 --- a/classes/db/DBSqlite3_pdo.class.php +++ b/classes/db/DBSqlite3_pdo.class.php @@ -581,31 +581,30 @@ } + $click_count = array(); + if(!$output->columns) $output->columns = array('*'); - if(!$output->columns) { - $columns = '*'; - } else { - $column_list = array(); - foreach($output->columns as $key => $val) { - $name = $val['name']; - $alias = $val['alias']; - if($val['click_count']) $click_count[] = $val['name']; + $column_list = array(); + foreach($output->columns as $key => $val) { + $name = $val['name']; + $alias = $val['alias']; + if($val['click_count']) $click_count[] = $val['name']; - if(substr($name,-1) == '*') { - $column_list[] = $name; - } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { - if($alias) $column_list[] = sprintf('%s as %s', $name, $alias); - else $column_list[] = sprintf('%s',$name); - } else { - if($alias) $column_list[] = sprintf('%s as %s', $name, $alias); - else $column_list[] = sprintf('%s',$name); - } - } - $columns = implode(',',$column_list); - } + if(substr($name,-1) == '*') { + $column_list[] = $name; + } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { + if($alias) $column_list[$alias] = sprintf('%s as %s', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } else { + if($alias) $column_list[$alias] = sprintf('%s as %s', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } + } + $columns = implode(',',$column_list); $condition = $this->getCondition($output); + $output->column_list = $column_list; if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 @@ -621,17 +620,31 @@ } } - $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition); - - if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + if(count($output->groups)){ + $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); + if(count($output->arg_columns)) + { + foreach($output->groups as $group) + { + if($column_list[$group]) $output->arg_columns[] = $column_list[$group]; + } + } + } if($output->order) { foreach($output->order as $key => $val) { $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; } - if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list); } + if(count($output->arg_columns)) + { + $columns = join(',',$output->arg_columns); + } + + $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query); // list_count를 사용할 경우 적용 if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']); @@ -660,6 +673,7 @@ function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); + $column_list = $output->column_list; /* // group by 절이 포함된 SELECT 쿼리의 전체 갯수를 구하기 위한 수정 // 정상적인 동작이 확인되면 주석으로 막아둔 부분으로 대체합니다. @@ -679,14 +693,10 @@ // 전체 개수를 구함 $count_query = sprintf("select count(*) as count from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition); - $total_count = $this->getCountCache($output->tables, $condition); - if($total_count === false) { - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; - $this->_prepare($count_query); - $count_output = $this->_execute(); - $total_count = (int)$count_output->count; - $this->putCountCache($output->tables, $condition, $total_count); - } + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; + $this->_prepare($count_query); + $count_output = $this->_execute(); + $total_count = (int)$count_output->count; $list_count = $output->list_count['value']; if(!$list_count) $list_count = 20; @@ -716,17 +726,30 @@ } } - $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition); - - if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + if(count($output->groups)){ + $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); + if(count($output->arg_columns)) + { + foreach($output->groups as $group) + { + if($column_list[$group]) $output->arg_columns[] = $column_list[$group]; + } + } + } if($output->order) { foreach($output->order as $key => $val) { $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; } - if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list); } + if(count($output->arg_columns)) + { + $columns = join(',',$output->arg_columns); + } + // return 결과물 생성 $buff = new Object(); $buff->total_count = 0; @@ -736,6 +759,7 @@ $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); // 쿼리 실행 + $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query); $query = sprintf('%s limit %d, %d', $query, $start_count, $list_count); $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';