首先根据自己的需要建立分表,我这里使用聊天室的msg 表,
将其分成msg_00,msg_01,msg_02,msg_03,msg_04,msg_05,msg_06,msg_07,msg_08,msg_09,等10张表
然后根据userID判断需要放在哪一张表;
第一步:
判断我要放在哪一表:
/* * 返回需要插入的表 */ public function get_table($table,$userid) { $str = $userid%10; if($str<0){ $hash = "0".substr(abs($str), 0, 1); }else{ $hash = substr($str, 0, 2); } return $table."_0".$hash; }第二步:
生产我要插入的唯一ID
(因为如果数据库自己生成,你无法提前知道,就无法判断它要插入到哪一张表中,但方法有很多,今天我只学到这一种,望大神们指教):
/* * 返回需要的唯一ID */ public function get_fetch_unique_bigint_id() { $start_timestamp = 1238119411; $ivan_len = 3; $time = explode( " ", microtime()); $id = ($time[1]-$start_timestamp) . sprintf("%06u", substr($time[0], 2, 6)); if ($ivan_len > 0) { $id .= substr(sprintf("%010u", mt_rand()), 0, $ivan_len); } return $id; }
第三步插入到数据表:
$msgID = $this->get_fetch_unique_bigint_id(); $data['id'] = $msgID; // $this->ajaxReturn (json_encode($data),'JSON'); $table = $this->get_table('msg',$msgID); $dd = M($table)->data($data)->add();第三步遍历查询出来:
//循环查询所有的分表 $table = array("msg_00","msg_01","msg_02","msg_03","msg_04","msg_05","msg_06","msg_07","msg_08","msg_09"); $select = array(); $time = $data['time']; foreach($table as $v) { $select[] = "(select * from $v where time=$time )"; } $sql = join(' UNION ', $select); $Model = new \Think\Model(); // 实例化一个model对象 没有对应任何数据表 $dataa = $Model->query($sql);
当你的where需要很多条件时可以这么写
//循环查询所有的分表 $table = array("per_msg_00","per_msg_01","per_msg_02","per_msg_03","per_msg_04","per_msg_05","per_msg_06","per_msg_07","per_msg_08","per_msg_09"); $select = array(); foreach($table as $v) { $select[] = "(select * from $v where (receiver = '$nickname'OR receiver= '$receiver') AND (sender = '$nickname' OR sender= '$receiver'))"; } $sql = join(' UNION ', $select); $Model = new \Think\Model(); // 实例化一个model对象 没有对应任何数据表 $msg = $Model->query($sql);