iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 9
0
自我挑戰組

自學CodeIgniter跌跌撞撞30天系列 第 9

[ Day 9 ] CodeIgniter第二個手作:番外篇(2):Active Record——select() 、 from()、join()

前言

今天誤會自己斷賽了,緊張慘了,後來才想起來昨日有發文。好拉!前面都是題外話,今天會跟大家介紹Select()、from()以及join()這三個在SQL都是很基本的東西。本來期望把where()一起殺掉,看來是沒辦法,雖然是簡單的東西,但~是很基本(必知?),所以不能忽略、帶過它,只好再另闢新章(?)。

查詢資料:指定欄位&欄位加總、平均⋯⋯

指定欄位

Select()
CI做查詢時是可以做到只撈特定欄位出來的,此時,只要將select()下在查詢語法前面並指定欄位即可,代碼如下:

$this->db->select('title, content, date');
$query = $this->db->get('mytable');
//  SELECT title, content, date FROM mytable

彙總欄位

select_max()
select_max()等同於資料庫指令「SELECT MAX(欄位) FROM TABLE」,通常彙總欄位都會另外取名字,畢竟~計算前與計算後的名稱相同容易混淆。以下為User Guide的範例:

$this->db->select_max('age');
$query = $this->db->get('members');
// 產生: SELECT MAX(age) as age FROM members

$this->db->select_max('age', 'member_age');
$query = $this->db->get('members');
// 產生: SELECT MAX(age) as member_age FROM members

依此類推的其他彙總形式

//最小值
$this->db->select_min('age');
$query = $this->db->get('members');

//平均值
$this->db->select_avg('age');
$query = $this->db->get('members');

//加總
$this->db->select_sum('age');
$query = $this->db->get('members');

進階form() & join():不只查詢可以用

指定資料表 FROM

get()及get_where()中已經包含來源Table了,from()不免讓初學者質疑存在的必要。若查詢結果需要來自多個表(JOIN)或者條件較為複雜(where)時,get()及get_where()無法達到需求,此時就只能用from()了!form()本身不複雜,只需要傳入Table即可,user guide提供的例子也很簡單:

$this->db->select('title, content, date');
$this->db->from('mytable');
$query = $this->db->get();

關聯資料表 JOIN

實務上很少會有網站、需求全部都是非常單純的單表查詢,某些查詢結果是將多張表的結果關聯後撈出來。不能直接下語法的話又該如何做到JOIN呢?

基本JOIN使用
SQL:

 SELECT * FROM blogs
 JOIN comments ON comments.id = blogs.id

CI:

$this->db->select('*');
$this->db->from('blogs');
$this->db->join('comments', 'comments.id = blogs.id');
$query = $this->db->get();

斯斯有三種,JOIN的型態也很多種
除了學生可能比較不熟悉外,對SQL有語法的人多少都知道JOIN有很多種:left、right、outer、inner、left outer 以及 right outer 。CI也能做到,在JOIN的第三個參數設置,代碼:
SQL:

SELECT * FROM blogs
LEFT JOIN comments ON comments.id = blogs.id

CI:

$this->db->select('*');
$this->db->from('blogs');
$this->db->join('comments', 'comments.id = blogs.id', 'left');
$query = $this->db->get();

結尾

今天在這裡把Select()做個結束,Where()的東西滿多的,在這邊延伸在這邊一起帶完太牽強了,所以在這裡先讓Select做個落幕,謝謝閱讀者的支持。


上一篇
[ Day 8 ] CodeIgniter第二個手作:番外篇(1):Active Record——查詢資料 (Selecting)
下一篇
[ Day 10 ] CodeIgniter第二個手作:番外篇(3):Active Record—— WHERE條件式
系列文
自學CodeIgniter跌跌撞撞30天12

尚未有邦友留言

立即登入留言