mysql find_in_set的使用

使用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);
}

 

posted @ 2015-11-22 17:11  代达罗斯之殇  阅读(450)  评论(0编辑  收藏  举报