標籤:
使用mysql資料庫的函數雖然不是一兩天了 ,但是很少體會到它帶來的"特殊便利",這次使用頗有感觸
首先是一張關於user的表 表中有個欄位是描述使用者喜好的,這樣就可以根據使用者愛好,向使用者推薦相似喜好的人
但是資料庫的設計人員設計的很不精緻,他用數字123456789 代表各種興趣 然後每個使用者這個欄位就被存為 ",1,2,3,4,"這樣用逗號分隔的形式,起初剛接到這樣的資料庫設計 我覺得應該會很難,起碼很不容易取到相同愛好的人,事實證明果然很不容易. 以為朋友建議我使用位元運算,但我始終覺得這並非良策,於是遲遲沒有下手.其實find_in_set 早就在腦海裡了,只是我還沒想好怎麼用他而已,
就在我瞭解到這個網站的使用者量非常少不足3000人(因為這個網站的使用者都從事某個特殊的領域);
使用者少 流量不大 我就深深的鬆了口氣,如果不是這樣的話 我會向他們提議重新設計資料庫,加入(映射表)關聯表,
最後總算是解決了
/**
* 擷取相同興趣的人
* @param string $table_name 表名
* @param string $field 欄位(用逗號分隔的那個欄位的名稱)
* @param int $id 主鍵id(跟某人相關,這裡就是某人的id)
* @return [Array] [相關的記錄的id的合集](這裡取出了5個)
*/
public function getRelationType($table_name,$field,$id){
$oriField = DB::select("select $field from $table_name where id = ?",array($id));
$oriField = trim($oriField[0]->$field,‘,‘);
$oriFieldArr = explode(‘,‘, $oriField);
$sql=array();
foreach($oriFieldArr as $k=>$v){
$sql[] = "select id FROM $table_name where FIND_IN_SET(‘$v‘,$field)";
}
$sqlstr = implode(‘ UNION ALL ‘,$sql);
$sqlstr = ‘select id,count(idsa.id) as num FROM(‘.$sqlstr.‘) as idsa group by idsa.id order by num desc limit 6‘;
$results = DB::select($sqlstr);
$idArr=array();
foreach($results as $k=>$v){
if($v->id!=$id){
$idArr[]=$v->id;
}
}
if(count($idArr)>5){
array_pop($idArr);
}
mysql find_in_set的使用