-
获得我们需要的数组
$user_id = User_::getMyId();
$department_id = DB::table('user')->where('id',$user_id)->value('department_id');
$parent_id = DB::table('department')->where('id',$department_id)->value('parent_id');
$ids = array();
array_push($ids,$department_id);
if($parent_id == '0' || $parent_id == '567'){
$arr = DB::table('department')->where('parent_id',$department_id)->pluck('id');
$arr = $arr->toArray();
if(!empty($arr)){
foreach ($arr as $k => $v) {
array_push($ids, $arr[$k]);
$arr2[$k] = DB::table('department')->where('parent_id',$arr[$k])->pluck('id');
$arr2[$k] = $arr2[$k]->toArray();
if(!empty($arr2[$k])){
foreach ($arr2[$k] as $key => $value) {
array_push($ids, $arr2[$k][$key]);
得到数组,例如[3,1,2,4,7,8];
2.根据获得数组查询需要的数据
$Obj = Department::with($with);
if($parent_id == '0' || $parent_id == '567'){
$Obj->whereIn('id',$ids);
}else{
$Obj->where('id', $department_id);
获得 id在$ids数组中的数据 使用whereIn查询
3.根据数组中元素的顺序进行排序
if($parent_id == '0' || $parent_id == '567'){
$Obj->orderBy(\DB::raw('FIND_IN_SET(id, "' . implode(",", $ids) . '"' . ")"));
获得我们需要的数组 $user_id = User_::getMyId(); $department_id = DB::table('user')->where('id',$user_id)->value('department_id'); $parent_id = DB::table('department')->where('id',$department_id)->value('parent_id'); $id.
select * from table where id in ('783',' 769',' 814',' 1577',' 1769')
order by find_in_set( id, '783, 769, 814, 1577, 1769' )
为什么不是 783 769 814 1577 1769 的顺序?
注意:经查找后原因出在find_in_set里面,如果f
有个文章表里面有个type字段,它存储的是文章类型,有 1头条、2推荐、3热点、4图文等等 。
现在有篇文章他既是头条,又是热点,还是图文,type中以 1,3,4 的格式存储。那我们如何用sql查找所有type中有4的图文类型的文章呢??
这就要我们的 find_in_set 出马的时候到了。以下为引用的内容:
select * from article where FIND_IN_SET('4',type)
———————————————————-
MySQL手册中find_in_set函数的语法:
FIND_IN_SET(str,strlist)
这是我最近新接触到的一个函数,
我在项目中的使用场景是这样的:
有一个应用类型表,表中有parentId字段和parentIds字段,前者为父级id,后者为多级父级id,在库中都是varchar类型,parentIds由多个父级id拼接而成由”,”分隔.
组长告知我可以使用该函数,就去进行了了解与使用.
FIND_IN_SET(str,strlist)
假如字符串str在由多个子链组成的字符串列表strlist中,则返回值的范围在1到N之间。
一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。
如果第一个参数是一个常数字符串,而第二个是type
在 MybatisPlus 中使用 find_in_set 函数可以通过以下方式实现:
1. 在 xml 映射文件中编写 SQL 语句,使用 CONCAT 和 GROUP_CONCAT 组合起待匹配字符串。
<select id="findInSet" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM table_name
WHERE FIND_IN_SET(#{matchValue}, CONCAT(column_name, ',', GROUP_CONCAT(match_column_name)))
</select>
2. 在对应的 Mapper 接口中声明对应的方法。
@Mapper
public interface TableMapper extends BaseMapper<TableEntity> {
@Select("SELECT COUNT(*) FROM table_name WHERE FIND_IN_SET(#{matchValue}, CONCAT(column_name, ',', GROUP_CONCAT(match_column_name)))")
Integer findInSet(@Param("matchValue") String matchValue);
其中,#{matchValue} 表示待匹配的字符串。需要注意的是,如果字符串中含有逗号,需要进行分隔符的转义处理。