之所謂關關難過關關過,遇到問題就要爆肝解決了阿?阿不然呢!!
講這麼多也是要抱怨一下,目前遇到一個問題就是客戶有4個資料表,分別是影片/相片/新聞/檔案,四個表都是獨立的,需要做一個總表吧4個表的內容按照建立時間排序顯示,之前一直卡在join的邏輯中解不出來,後來才想到join主要是做資料表欄位關連,而不是合併顯示,上網查了一下mysql操作手冊終於讓我找到一個可以解決問題方法,真是感動阿,用UNION ALL就可以解決了阿,方法如下。
//重點說明-很重要
使用UNION ALL查詢的多個資料表的欄位名稱都要相同才能抓地到數值,例如資料表table1中的name欄位那table2也必須要相同的name欄位名稱,欄位格式也都需相同,才能抓到兩個表的相同資料。
資料表 table1
資料表 table2
資料表 table3
資料表 table4
我們只需要取得ID,TITLE跟TIMES這三個欄位數值即可,其他欄位不用顯在總表中!!
Xoops資料表語法
//先在function.php中加上以下的合併查詢功能
//合併資料表查詢
function mergetablewhile($table="",$tablenane="",$where="",$order="",$type=""){
global $xoopsDB;
foreach($table as $key=> $val){
講這麼多也是要抱怨一下,目前遇到一個問題就是客戶有4個資料表,分別是影片/相片/新聞/檔案,四個表都是獨立的,需要做一個總表吧4個表的內容按照建立時間排序顯示,之前一直卡在join的邏輯中解不出來,後來才想到join主要是做資料表欄位關連,而不是合併顯示,上網查了一下mysql操作手冊終於讓我找到一個可以解決問題方法,真是感動阿,用UNION ALL就可以解決了阿,方法如下。
//重點說明-很重要
使用UNION ALL查詢的多個資料表的欄位名稱都要相同才能抓地到數值,例如資料表table1中的name欄位那table2也必須要相同的name欄位名稱,欄位格式也都需相同,才能抓到兩個表的相同資料。
資料表 table1
ID | TITLE | TIMES | NAME1 |
1 | 影片標題01 | 2018-10-18 | AAA |
2 | 影片標題02 | 2018-9-18 | BBBBB |
資料表 table2
ID | TITLE | TIMES | NAME2 |
1 | 相片標題01 | 2018-10-17 | AAA |
2 | 相片標題02 | 2018-9-17 | BBBBB |
資料表 table3
ID | TITLE | TIMES | NAME3 |
1 | 新聞標題01 | 2018-10-16 | AAA |
2 | 新聞標題02 | 2018-9-16 | BBBBB |
資料表 table4
ID | TITLE | TIMES | NAME4 |
1 | 檔案標題01 | 2018-10-15 | AAA |
2 | 檔案標題02 | 2018-9-15 | BBBBB |
我們只需要取得ID,TITLE跟TIMES這三個欄位數值即可,其他欄位不用顯在總表中!!
//先在function.php中加上以下的合併查詢功能
//合併資料表查詢
function mergetablewhile($table="",$tablenane="",$where="",$order="",$type=""){
global $xoopsDB;
foreach($table as $key=> $val){
$selectvar.="SELECT ".$tablenane." FROM ".$xoopsDB->prefix($val)." ".$where." UNION ALL ";
}
$selectvar=substr($selectvar,0,-10);
$sql = "".$selectvar." ".$order."";
$result = $xoopsDB -> query($sql);
$i=1;
while($tableArray= $xoopsDB ->fetchArray($result)){
$tableArrayArr[$i]=$tableArray;
$i++;
};
return $tableArrayArr;
}
//再需要使用合併查詢的php中呼叫mergetablewhile()函式
$table['0']="table1"; //資料表名稱
$table['1']="table2"; //資料表名稱
$table['2']="table3"; //資料表名稱
$table['3']="table4"; //資料表名稱
$tablenane="ID,TITLE,TIMES"; //相同欄位的名稱查詢-用,區隔
$where="where `TIMES` = '".$TIMES."'"; //查詢條件
$order="order by TIMES desc"; //使用TIMES排序新->舊
$keywordArr=mergetablewhile($table,$tablenane,$where,$order);
foreach($keywordArr as $key=> $val){
echo $keywordArr[$key]['title']."<br />";
}
}
$selectvar=substr($selectvar,0,-10);
$sql = "".$selectvar." ".$order."";
$result = $xoopsDB -> query($sql);
$i=1;
while($tableArray= $xoopsDB ->fetchArray($result)){
$tableArrayArr[$i]=$tableArray;
$i++;
};
return $tableArrayArr;
}
//再需要使用合併查詢的php中呼叫mergetablewhile()函式
$table['0']="table1"; //資料表名稱
$table['1']="table2"; //資料表名稱
$table['2']="table3"; //資料表名稱
$table['3']="table4"; //資料表名稱
$tablenane="ID,TITLE,TIMES"; //相同欄位的名稱查詢-用,區隔
$where="where `TIMES` = '".$TIMES."'"; //查詢條件
$order="order by TIMES desc"; //使用TIMES排序新->舊
$keywordArr=mergetablewhile($table,$tablenane,$where,$order);
foreach($keywordArr as $key=> $val){
echo $keywordArr[$key]['title']."<br />";
}
輸出結果就會是
ID | TITLE | TIMES |
1 | 影片標題01 | 2018-10-18 |
1 | 相片標題01 | 2018-10-17 |
1 | 新聞標題01 | 2018-10-16 |
1 | 檔案標題01 | 2018-10-15 |
2 | 影片標題02 | 2018-9-18 |
2 | 相片標題02 | 2018-9-17 |
2 | 新聞標題02 | 2018-9-16 |
2 | 檔案標題02 | 2018-9-15 |
這樣就完成資料表的合併顯示內容操作,而且還可以設查詢條件,搞定收工!!
參考資料來源:https://dev.mysql.com/doc/refman/8.0/en/union.html
教學撰寫:徐嘉裕 Neil hsu
參考資料來源:https://dev.mysql.com/doc/refman/8.0/en/union.html
教學撰寫:徐嘉裕 Neil hsu
留言
張貼留言