mysql find_in_set的使用

來源:互聯網
上載者:User

標籤:

使用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的使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.