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

时间: 2024-10-28 20:08:35

mysql find_in_set的使用的相关文章

mysql FIND_IN_SET 用法

mysql 中 FIND_IN_SET  是判断某个字符串是否在带逗号的字符串中 例如 SELECT t.group_id, COUNT(group_id) tsum FROM (SELECT group_id FROM xx WHERE FIND_IN_SET(openid,'qqqwqnfocFq5IL2sXB2Qu0I,oarwerrr-2KRah_TklJEomljhlKg,oaSiouEgtr5t5utLFU8-evmkn5BwQ3_c') AND user_uuid = 'xxxxx

mysql find_in_set在oracle下的解决方案

比如一张表: artile (id,type,content); type:1表示文艺类,2表示小说类,3表示传记,4表示传说,等等5,6,7,8 表数据: id type content 1 3,1 dfasdfasdf 2 1,3,6,8 dfasdf 3 6,8,9 add 现在要找出3传记类的artile记录 mysql: select * from artile where find_in_set('3',type); oralce 语句实现: select * from artile

mysql FIND_IN_SET方法的使用实例

以下是原来的查询方式: $inviterUserExt = UserExt::findOne(['user_id' => $inviteUser->id, 'store_id' => $_storeId, 'is_subscribe' => IS_SUBSCRIBE]); if (!$inviterUserExt) { $inviterUserExt = UserExt::findOne(['user_id' => $inviteUser->id, 'is_subscr

MYSQL养成记-MYSQL基础增强(Myql函数)

MYSQL基础增强(Myql函数) 在这里只介绍一些常用的,比较新颖的: 字符串函数: CONCAT://字符串连接函数mysql> SELECT CONCAT('My', 'S', 'QL'); -> 'MySQL' mysql> SELECT CONCAT('My', NULL, 'QL');//与null连接会变null -> NULL mysql> SELECT CONCAT(14.3); -> '14.3' CONCAT_WS://含分隔符的字符串连接mysq

MySQL(5.6) 函数

字符串函数 ASCII(str) 说明:返回字符串 str 最左边字符的 ASCII 值 mysql> SELECT ASCII('2'); -> 50 mysql> SELECT ASCII(2); -> 50 mysql> SELECT ASCII('a'); -> 97 mysql> SELECT ASCII(''); -> 0 mysql> SELECT ASCII(NULL); -> NULL BIN(N) 说明:返回数值 N 的二进制

mysql中FIND_IN_SET的使用方法

根据表goods的id和site_id查处goods表id对应的网站名称. 表goods数据 表site数据 这种情况下用子查询不好处理,而mysql提供了线程的find_in_set函数再结合group by来实现此功能. SELECT g.*,GROUP_CONCAT(s.name) site_name FROM goods g LEFT JOIN site s ON FIND_IN_SET(s.id,g.site_id) GROUP BY g.id 查询结果

Mysql字符串字段中是否包含某个字符串,用 find_in_set

有这样一个需求,在Mysql数据库字符串字段(权限)中,有范围在 1 到 N 之间代表不同权限的值,分别被‘,’分开,现在要取出具有某权限的所有成员列表. 创建表: 1 CREATE TABLE users(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),name VARCHAR(20) NOT NULL,limits VARCHAR(50) NOT NULL); 添加数据: 1 INSERT INTO users(name, limits)

Mysql字符串函数FIND_IN_SET()的两点用法

概要:该可以查询用逗号分割的字段,以及对结果进行强制排序 首先看一张表: colid vyear area cast ,31,32,21,12 2014 1 15 ,32,33,34,35,21, 2014 2 16 ,33,34,36,39,40 2011 3 17 表中的colid字段的值是以逗号分割, 当我们需要查询这张表中,colid含有32的行, 那么可以用FIND_IN_SET() SQL如下: SELECT * FROM table WHERE FIND_IN_SET('32',

【MySQL】MySQL的find_in_set的使用例子

> 参考的优秀文章 FIND_IN_SET(str,strlist) > 简单的例子 这个函数的功能是,在第二个参数中寻找第一个参数,并返回第一个参数所在的位置,不存在则返回0.其中,第二个参数是以“,”分隔的字符串. -- 1select find_in_set('1', '1,2,3,4,5,6'); -- 2 select find_in_set('2', '1,2,3,4,5,6'); -- 0 select find_in_set('7', '1,2,3,4,5,6'); -- 0