Driver_Database_Driver_MySQL::_compile_selete
null Driver_Database_Driver_MySQL::_compile_selete( )
File: ./drivers/database/mysql/mysql.class.php
protected function _compile_selete($builder)
{
$quote_ident = array($this, '_quote_identifier');
$quote_table = array($this, 'quote_table');
$query = 'SELECT ';
if ($builder['distinct'])
{
if (true===$builder['distinct'])
{
$query .= 'DISTINCT ';
}
else
{
$builder['select_adv'][] = array
(
$builder['distinct'],
'distinct',
);
}
}
$this->_init_as_table($builder);
$this->format_select_adv($builder);
if (empty($builder['select']))
{
$query .= '*';
}
else
{
$query .= implode(', ', array_unique(array_map($quote_ident, $builder['select'])));
}
if (!empty($builder['from']))
{
// Set tables to select from
$query .= ' FROM ' . implode(', ', array_unique(array_map($quote_table, $builder['from'], array(true))));
}
if (!empty($builder['index']))
{
foreach ($builder['index'] as $item)
{
$query .= ' '.strtoupper($item[1]).' INDEX('.$this->_quote_identifier($item[0]).')';
}
}
if (!empty($builder['join']))
{
// Add tables to join
$query .= ' ' . $this->_compile_join($builder['join']);
}
if (!empty($builder['where']))
{
// Add selection conditions
$query .= ' WHERE ' . $this->_compile_conditions($builder['where'], $builder['parameters']);
}
if (!empty($builder['group_by']))
{
// Add sorting
$query .= ' GROUP BY ' . implode(', ', array_map($quote_ident, $builder['group_by']));
}
if (!empty($builder['having']))
{
// Add filtering conditions
$query .= ' HAVING ' . $this->_compile_conditions($builder['having'], $builder['parameters']);
}
if (!empty($builder['order_by']))
{
// Add sorting
$query .= ' ' . $this->_compile_order_by($builder['order_by']);
}
elseif ($builder['where'])
{
# 如果查询中有in查询,采用自动排序方式
$in_query = null;
foreach ($builder['where'] as $item)
{
if (isset($item['AND']) && $item['AND'][1] == 'in')
{
if (count($item['AND'][1]) > 1)
{
# 大于1项才需要排序
$in_query = $item['AND'];
}
break;
}
}
if ($in_query)
{
$query .= ' ORDER BY FIELD(' . $this->_quote_identifier($in_query[0]) . ', ' . implode(', ', $this->quote($in_query[2])) . ')';
}
}
if ($builder['limit'] !== null)
{
// Add limiting
$query .= ' LIMIT ' . $builder['limit'];
}
if ($builder['offset'] !== null)
{
// Add offsets
$query .= ' OFFSET ' . $builder['offset'];
}
return $query;
}