Query_Builder_Select class
			(extends Query_Builder_Where)
			
				The Query_Builder_Select class handles all the select operations for the query building process. It extends the
				Query_Builder_Where class, so all the methods are inherited.
			
			
				distinct($value = true)
				The distinct method sets whether to select distinct values.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								
									
										| Param | 
										Type | 
										Default | 
										Description | 
									 
									
										| $value | 
										bool | 
										true
  | 
										set to false if you don't want to select distinct values | 
									 
								 
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select('name')->from('users');
// Set it to distinct
$query->distinct();
// SELECT DISTINCT `name` FROM `users`
 
							 | 
						
					
				
			
			
				select($columns = null)
				The select method appends columns to select.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								
									
										| Param | 
										Type | 
										Default | 
										Description | 
									 
									
										| $columns | 
										mixed | 
										true
  | 
										column name or array($column, $alias) | 
									 
								 
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select('name')->from('users');
// Append other columns to select
$query->select('surname', 'email');
// Supply an array to use an alias
$query->select(
	array('is_active', 'active'),
	'birthdate'
);
// SELECT `name`, `surname`, `email`, `is_active` AS `active`, `birthdate` FROM `users`
 
							 | 
						
					
				
			
			
				select_array(array $columns, $reset = false)
				The select_array method appends columns to select.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								
									
										| Param | 
										Type | 
										Default | 
										Description | 
									 
									
										| $columns | 
										array | 
										required | 
										an array containing column names | 
									 
									
										| $reset | 
										bool | 
										false
  | 
										If true, do not append, but overwrite | 
									 
								 
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select('name')->from('users');
// Append other columns to select
$query->select('surname', 'email');
// Supply an array to use an alias
$query->select_array(array(
	array('is_active', 'active'),
	'birthdate'
));
// produces SELECT `name`, `surname`, `email`, `is_active` AS `active`, `birthdate` FROM `users` ...
// Supply an array to use an alias and reset the previous select
$query->select_array(array(
	array('surname', 'name'),
	'birthdate'
), true);
// produces SELECT `surname` AS `name`, `birthdate` FROM `users` ...
 
							 | 
						
					
				
			
			
				from($tables)
				The from method appends tables to select from.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								
									
										| Param | 
										Type | 
										Default | 
										Description | 
									 
									
										| $tables | 
										mixed | 
										required | 
										table names or array($table, $alias) | 
									 
								 
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select()->from('users');
// Append tables to select from
$query->from(
	'admins',
	array('comments', 'cmmnts')
);
// SELECT * FROM `users`, `admins`, `comments` cmmnts
 
							 | 
						
					
				
			
			
				join($table, $type = null)
				The join method appends tables to join.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								
									
										| Param | 
										Type | 
										Default | 
										Description | 
									 
									
										| $table | 
										mixed | 
										required | 
										table name or array($table, $alias) | 
									 
									
										| $type | 
										mixed | 
										true
  | 
										join type (LEFT, RIGHT, INNER, etc) | 
									 
								 
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select()->from('users');
// Join a table
$query->join('profiles');
// SELECT * FROM `users` JOIN `profiles`
// or...
$query = DB::select()->from('users');
// Join another table
$query->join('pictures', 'RIGHT OUTER');
// SELECT * FROM `users` RIGHT OUTER JOIN `pictures`
 
							 | 
						
					
				
			
			
				on($c1, $op, $c2)
				The on method adds "ON ..." conditions for the last created JOIN statement.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								
									
										| Param | 
										Type | 
										Default | 
										Description | 
									 
									
										| $c1 | 
										mixed | 
										required | 
										table name or array($table, $alias) | 
									 
									
										| $op | 
										string | 
										required | 
										logical operator | 
									 
									
										| $c2 | 
										mixed | 
										required | 
										table name or array($table, $alias) | 
									 
								 
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select()->from('users');
// Join a table
$query->join('profiles');
$query->on('users.id', '=', 'profiles.user_id');
// SELECT * FROM `users` JOIN `profiles` ON `users`.`id` = `profiles`.`user_id`
 
							 | 
						
					
				
			
			
				and_on()
				The and_on method is an alias for on.
			
			
				or_ on($c1, $op, $c2)
				The on method adds "OR ON ..." conditions for the last created JOIN statement.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								
									
										| Param | 
										Type | 
										Default | 
										Description | 
									 
									
										| $c1 | 
										mixed | 
										required | 
										table name or array($table, $alias) | 
									 
									
										| $op | 
										string | 
										required | 
										logical operator | 
									 
									
										| $c2 | 
										mixed | 
										required | 
										table name or array($table, $alias) | 
									 
								 
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select()->from('users');
// Join a table
$query->join('profiles');
$query->on('users.id', '=', 'profiles.user_id');
// Add an OR ON condition
$query->or_on('users.id', '=', 'profiles.other_id');
// SELECT * FROM `users` JOIN `profiles` ON `users`.`id` = `profiles`.`user_id` OR `users`.`id` = `profiles`.`other_id`
 
							 | 
						
					
				
			
			
				on_open()
				The on_open method adds an open bracket for the last created JOIN statement.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								None
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								See below
							 | 
						
					
				
			
			
				on_close()
				The on_close method adds an closing bracket for the last created JOIN statement.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								None
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select()->from('users');
// Join a table
$query->join('profiles');
$query->on('users.id', '=', 'profiles.user_id');
// Add some nested conditions
$query->on_open()
  ->on('profiles.status', '=', DB::expr('A')
  ->or_on('profiles.status', '=', DB::expr('B')
->on_close();
// SELECT * FROM `users` JOIN `profiles` ON `users`.`id` = `profiles`.`user_id`
//          AND (`profiles`.`status` = "A" OR  `profiles`.`status` = "B"))
 
							 | 
						
					
				
			
			
				and_on()
				The and_on method is an alias for on.
			
			
				group_by($columns)
				The group_by method creates a "GROUP BY ..." filter.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								
									
										| Param | 
										Type | 
										Default | 
										Description | 
									 
									
										| $columns | 
										mixed | 
										required | 
										table name | 
									 
								 
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select()->from('articles');
// Group by 'genre'
$query->group_by('genre', 'category');
// SELECT * FROM `articles` GROUP BY `genre`, `category`
 
							 | 
						
					
				
			
			
				having($column, $op, $value = NULL)
				The having method is an alias for and_having.
			
			
				and_having($column, $op, $value = NULL)
				The and_having method appends a "AND HAVING" statement.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								
									
										| Param | 
										Type | 
										Default | 
										Description | 
									 
									
										| $column | 
										string | 
										required | 
										Column name or array($column, $alias), object or callback | 
									 
									
										| $op | 
										string | 
										null
  | 
										Logic operator: =, !=, IN, BETWEEN and LIKE. | 
									 
									
										| $value | 
										mixed | 
										null
  | 
										Column value | 
									 
								 
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select('*')->from('users');
// Set the first HAVING statement
$query->having('name', '!=', 'John');
// and append a new condition
$query->and_having('surname', '=', 'Doe');
// create a group using a callback
$query->and_having(function($query){
	$query->having('email', 'info@example.com');
	$query->or_having('email', 'second@example.com');
});
// Resulting in:
// SELECT * FROM `users` HAVING `name` != "John" AND `surname` = "Doe"
// AND (`email` = "info@example.com" OR `email` = "second@example.com")
 
							 | 
						
					
				
			
			
				or_having($column, $op, $value = NULL)
				The or_having method appends a "OR HAVING" statement.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								
									
										| Param | 
										Type | 
										Default | 
										Description | 
									 
									
										| $column | 
										string | 
										required | 
										Column name or array($column, $alias), object or callback | 
									 
									
										| $op | 
										string | 
										null
  | 
										Logic operator: =, !=, IN, BETWEEN and LIKE. | 
									 
									
										| $value | 
										mixed | 
										null
  | 
										Column value | 
									 
								 
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select('*')->from('users');
// Set the first HAVING statement
$query->having('name', '!=', 'John');
// and append a new condition
$query->or_having('surname', '=', 'Doe');
// create a group using a callback
$query->or_having(function($query){
	$query->having('email', 'info@example.com');
	$query->and_having('email', 'second@example.com');
});
// Resulting in:
// SELECT * FROM `users` HAVING `name` != "John" OR `surname` = "Doe"
// OR (`email` = "info@example.com" AND `email` = "second@example.com")
 
							 | 
						
					
				
			
			
				having_open()
				The having_open method is an alias for and_having_open.
			
			
				and_having_open()
				The and_having_open method opens an SQL closure and appends it using AND.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								None
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select('*')->from('users');
// Set a HAVING statement
$query->having('name', '=', 'john')
// Open a closure
$query->and_having_open();
// SELECT * FROM `users` HAVING `name` = "John" AND (
 
							 | 
						
					
				
			
			
				or_having_open()
				The or_having_open method opens an SQL closure and appends it using OR.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								None
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select('*')->from('users');
// Set a HAVING statement
$query->having('name', '=', 'john')
// Open a closure
$query->or_having_open();
// SELECT * FROM `users` HAVING `name` = "John" OR (
 
							 | 
						
					
				
			
			
				having_close()
				The having_close method is an alias for and_having_close.
			
			
				and_having_close()
				The and_having_close method closes an SQL closure.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								None
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select('*')->from('users');
// Open a closure
$query->and_having_open();
// Set a HAVING statement
$query->having('name', '=', 'john');
$query->and_having_close();
// SELECT * FROM `users` HAVING (`name` = "John")
 
							 | 
						
					
				
			
			
				or_having_close()
				The or_having_close method closes an SQL closure.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								None
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select('*')->from('users');
// Set a HAVING statement
$query->having('email', 'like', '%@example.com');
// Open a closure
$query->or_having_open();
// Set a HAVING statement
$query->having('name', '=' 'John');
$query->and_having('surname', '=', 'Doe');
$query->or_having_close();
// SELECT * FROM `users` HAVING `email` LIKE "%example.com" OR (`name` = "John" AND `surname` = "Doe")
 
							 | 
						
					
				
			
			
				offset($number)
				The offset method sets row number to start from when selecting/updating/deleting.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								
									
										| Param | 
										Type | 
										Default | 
										Description | 
									 
									
										| $number | 
										int | 
										required | 
										The row number to start from | 
									 
								 
							 | 
						
						
							| Returns | 
							Returns the current instance | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select('*')->from('users');
// Set the limit
$query->limit(10);
$query->offset(5);
// SELECT * FROM `users` LIMIT 10 OFFSET 5
 
							 | 
						
					
				
			
			
				compile(\Database_Connection$db)
				The compile method returns the select SQL query as a string.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								
									
										| Param | 
										Type | 
										Default | 
										Description | 
									 
									
										| $db | 
										object | 
										required | 
										A database connection | 
									 
								 
							 | 
						
						
							| Returns | 
							Returns the SQL query as a string. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select('*')->from('users');
// Set the limit and offset
$query->limit(10);
$query->offset(5);
// Get the database connection
$connection = Database_Connection::instance();
// Get the sql query
$sql = $query->compile($connection);
 
							 | 
						
					
				
			
			
				reset()
				The reset method resets all values of the current instance.
				
					
						
							| Static | 
							No | 
						
						
							| Parameters | 
							
								None
							 | 
						
						
							| Returns | 
							Returns the current instance. | 
						
						
							| Example | 
							
								// prepare a select statement
$query = DB::select('*')->from('users');
// Set some conditions
$query->where('name', 'bob');
$query->where('surname', 'unknown');
// Reset it
$query->reset();
// Set the new values
$query->select('email')->from('admins')->where('role', 'superadmin');
// The SQL query will now be:
// SELECT `email` FROM `admins` WHERE `role` = "superadmins"
 
							 |