前言:数据库分表就是将单个数据库表进行拆分,拆分成多个数据表,然后用户访问的时候,根据一定的规则,让用户访问不同的表,这样数据分散到多个数据表中,减少了单个数据表的访问压力。提升了数据库访问性能。分表的目的就在于此,减小数据库的负担,缩短查询时间。今天使用union联合查询是实现横向分表或相似结构表(笔者的使用场景)的多表操作
场景:基于laravel。对文章,视频,图集数据的回收查询
$videos=DB::table('videos')->select([DB::raw('"videos" as table_name'),'id','title','sub_title','user_id','category_id','status','verify_status','created_at','deleted_at']);
$article=DB::table('articles')->select([DB::raw('"articles" as table_name'),'id','title','sub_title','user_id','category_id','status','verify_status','created_at','deleted_at']);
$query=DB::table('pictures')->select([DB::raw('"pictures" as table_name'),'id','title','sub_title','user_id','category_id','status','verify_status','created_at','deleted_at'])->unionAll($videos)->unionAll($article);
$querySql = $query->toSql();
$result = DB::table(DB::raw("($querySql) as r"))
->mergeBindings($query)
->orderBy('deleted_at','asc')
->whereNotNull('deleted_at')
->get();
注意点:
- 联合查询用于将两个或更多查询的结果集组合为单个结果集,该结果集包含联合查询中所有查询的全部行。UNION的结果集列名与UNION运算符中第一个Select语句的结果集的列名相同,另一个Select语句的结果集列名将被忽略,且其他查询字段数必须和第一个相同。
- union还是unionAll都是对两个或更多结果集进行并集的操作.但是union是将两个或更多个表的结果联合在一起,会将select语句的结果中的重复值进行压缩,也就是结果的数据并不是多条结果的条数的和。如果希望即使重复的结果也要显示出来,应该使用unionAll