在做选盘网项目中遇到的需求:
$res = $project->query("SELECT * FROM (SELECT cr.object_id,sum(hits) total_like FROM cmf_ranking cr WHERE $order(date)=$order(now()) GROUP BY cr.object_id UNION SELECT cp.id,cp.redundance total_like FROM cmf_project cp WHERE cp.is_down = 1 and cp.status = 1 AND cp.stop_time > unix_timestamp()) tmp GROUP BY object_id ORDER BY total_like DESC");
这段sql语句用到了union all和group by,具体用法百度
// 最热项目列表页 public function projecthot() { $keywords = I('keywords', ''); $where['p_name'] = array('like', '%' . $keywords . '%'); $order = 'day'; if (I('order')) { $order = I('order'); } $project = M('Project'); $where['is_down'] = array('eq', 1); // 未下架的 //增加时效 $where['stop_time'] = array('EGT', time()); $where['status'] = array('eq', 1); // 查询侧边栏的最新和最热十条记录 $newdata = $this->getProjectNew(); $hotdata = $this->getProjectHot(); if ($order != 'total' && empty($keywords)) { // $now = time(); // $ranking = $project->query("select *,sum(hits) total_like from cmf_ranking cr,cmf_project cp where cp.id=cr.object_id and $order(date)=$order(now()) and cp.is_down = 1 and cp.stop_time > $now and cp.status = 1 group by object_id order by sum(hits) desc limit 0,10"); $res = $project->query("SELECT * FROM (SELECT cr.object_id,sum(hits) total_like FROM cmf_ranking cr WHERE $order(date)=$order(now()) GROUP BY cr.object_id UNION SELECT cp.id,cp.redundance total_like FROM cmf_project cp WHERE cp.is_down = 1 and cp.status = 1 AND cp.stop_time > unix_timestamp()) tmp GROUP BY object_id ORDER BY total_like DESC"); // $ranking = $project->query("select cp.*,SUM(hits) total_like from cmf_project cp left JOIN cmf_ranking cr on cp.id = cr.object_id WHERE cp.is_down = 1 and cp.status = 1 GROUP BY cp.id ORDER BY total_like desc"); // $count = count($ranking); // $Page = new \Think\Page($count, 10); // $data1 = $project->query("select cp.*,SUM(hits) total_like from cmf_project cp left JOIN cmf_ranking cr on cp.id = cr.object_id WHERE $order(date)=$order(now()) and cp.is_down = 1 and cp.status = 1 GROUP BY cp.id ORDER BY total_like desc limit $Page->firstRow, $Page->listRows"); // $data2 = $project->query("select cp.*,SUM(hits) total_like from cmf_project cp left JOIN cmf_ranking cr on cp.id = cr.object_id WHERE cp.is_down = 1 and cp.status = 1 GROUP BY cp.id ORDER BY total_like desc limit $Page->firstRow, $Page->listRows"); // for ($i = 0; $i < $count; $i++) { // $data['pro'][] = array_merge($data2[$i], $data1[$i]); // } // $data['page'] = $Page->show(); // foreach ($ranking as $k => $v) { // $key_id[] = $v['id']; // } // if ($key_id) { // $num = 10 - count($ranking); // $where['id'] = array('not in', $key_id); // $projecting = M('Project')->where($where)->limit(0, $num)->select(); // $data['pro'] = array_merge_recursive($ranking, $projecting); // } else { // $data['pro'] = $project->where($where)->order('post_like desc')->limit(0, 10)->select(); // } // 取出点赞的数量和价格 // $option = M('Options')->where("option_name='site_options'")->find(); // $option01 = json_decode($option['option_value'], true); // $site_like_price = json_decode(htmlspecialchars_decode($option01['site_like_price']), true); // foreach ($site_like_price as $k => $v) { // $like_price[$k] = '赞' . $k . '个(' . $v . '元)'; // } // $this->assign('data', $data); // $this->assign('order', $order); // $this->assign('like_price', $like_price); // $this->display();die; } else { $res = $project->query("SELECT * FROM (SELECT cr.object_id,sum(hits) total_like FROM cmf_ranking cr GROUP BY cr.object_id UNION SELECT cp.id,cp.redundance total_like FROM cmf_project cp WHERE cp.is_down = 1 and cp.status = 1 AND cp.stop_time > unix_timestamp()) tmp GROUP BY object_id ORDER BY total_like DESC"); } $count = count($res); $Page = new \Think\Page($count, 10); foreach ($res as $k => $v) { $ids[] = $v['object_id']; } $map['id'] = array('in', $ids); $res2 = $project->where($map)->limit($Page->firstRow . ',' . $Page->listRows)->select(); foreach ($res2 as $k1 => $v1) { foreach ($res as $k2 => $v2) { if ($v1['id'] == $v2['object_id']) { $res2[$k1]['total_like'] = $res[$k2]['total_like']; } } } //二维数组排序 $sort = array( 'direction' => 'SORT_DESC', //排序顺序标志 SORT_DESC 降序;SORT_ASC 升序 'field' => 'total_like', //排序字段 ); $arrSort = array(); foreach ($res2 as $uniqid => $row) { foreach ($row as $key => $value) { $arrSort[$key][$uniqid] = $value; } } if ($sort['direction']) { array_multisort($arrSort[$sort['field']], constant($sort['direction']), $res2); } $data['pro'] = $res2; $data['page'] = $Page->show(); // $count = $project->where($where)->count(); // $Page = new \Think\Page($count, 10); // $data['pro'] = $project->where($where)->order('post_like desc')->limit($Page->firstRow . ',' . $Page->listRows)->select(); // $data['page'] = $Page->show(); // 取出点赞的数量和价格 $option = M('Options')->where("option_name='site_options'")->find(); $option01 = json_decode($option['option_value'], true); $site_like_price = json_decode(htmlspecialchars_decode($option01['site_like_price']), true); foreach ($site_like_price as $k => $v) { $like_price[$k] = '赞' . $k . '个(' . $v . '元)'; } $this->assign(array( 'data' => $data, 'newdata' => $newdata, 'hotdata' => $hotdata, 'order' => $order, 'like_price' => $like_price, )); $this->display(); }
以上就是整个方法代码
MYSQL语句的调整:
SELECT pro.*,IFNULL(cr.total_hit,0) AS total_like FROM cmf_project AS pro LEFT JOIN (SELECT object_id, SUM(hits) AS total_hit FROM cmf_ranking WHERE MONTH(date)=MONTH(now()) GROUP BY object_id) AS cr ON pro.id=cr.object_id HAVING pro.is_down = 1 AND pro.status = 1 AND pro.stop_time > unix_timestamp() ORDER BY total_like DESC
以下是整个文件代码:
// 最热项目列表页 public function projecthot() { $nowPage = I('p', 1); $firstRow = 20 * ($nowPage - 1); $keywords = I('keywords', ''); $where['p_name'] = array('like', '%' . $keywords . '%'); $order = 'day'; if (I('order')) { $order = I('order'); } $project = M('Project'); $where['is_down'] = array('eq', 1); // 未下架的 //增加时效 $where['stop_time'] = array('EGT', time()); $where['status'] = array('eq', 1); // 查询侧边栏的最新和最热十条记录 $newdata = $this->getProjectNew(); $hotdata = $this->getProjectHot(); // $num = $project->query("SELECT * FROM (SELECT cr.object_id,sum(hits) total_like FROM cmf_ranking cr GROUP BY cr.object_id UNION SELECT cp.id,cp.redundance total_like FROM cmf_project cp WHERE cp.is_down = 1 and cp.status = 1 AND cp.stop_time > unix_timestamp()) tmp LEFT JOIN cmf_project cp on cp.id=tmp.object_id GROUP BY object_id ORDER BY total_like DESC"); $num = $project->query("SELECT pro.*,IFNULL(cr.total_hit,0) AS total_like FROM cmf_project AS pro LEFT JOIN (SELECT object_id, SUM(hits) AS total_hit FROM cmf_ranking GROUP BY object_id) AS cr ON pro.id=cr.object_id HAVING pro.is_down = 1 AND pro.status = 1 AND pro.stop_time > unix_timestamp() ORDER BY total_like DESC"); $count = count($num); if ($order != 'total') { // $now = time(); // $ranking = $project->query("select *,sum(hits) total_like from cmf_ranking cr,cmf_project cp where cp.id=cr.object_id and $order(date)=$order(now()) and cp.is_down = 1 and cp.stop_time > $now and cp.status = 1 group by object_id order by sum(hits) desc limit 0,20"); // $res = $project->query("SELECT * FROM (SELECT cr.object_id,sum(hits) total_like FROM cmf_ranking cr WHERE $order(date)=$order(now()) GROUP BY cr.object_id UNION SELECT cp.id,cp.redundance total_like FROM cmf_project cp WHERE cp.is_down = 1 and cp.status = 1 AND cp.stop_time > unix_timestamp()) tmp LEFT JOIN cmf_project cp on cp.id=tmp.object_id GROUP BY object_id ORDER BY total_like DESC LIMIT $firstRow,20"); $res = $project->query("SELECT pro.*,IFNULL(cr.total_hit,0) AS total_like FROM cmf_project AS pro LEFT JOIN (SELECT object_id, SUM(hits) AS total_hit FROM cmf_ranking WHERE $order(date)=$order(now()) GROUP BY object_id) AS cr ON pro.id=cr.object_id HAVING pro.is_down = 1 AND pro.status = 1 AND pro.stop_time > unix_timestamp() ORDER BY total_like DESC LIMIT $firstRow,20"); // $ranking = $project->query("select cp.*,SUM(hits) total_like from cmf_project cp left JOIN cmf_ranking cr on cp.id = cr.object_id WHERE cp.is_down = 1 and cp.status = 1 GROUP BY cp.id ORDER BY total_like desc"); // $count = count($ranking); // $Page = new \Think\Page($count, 20); // $data1 = $project->query("select cp.*,SUM(hits) total_like from cmf_project cp left JOIN cmf_ranking cr on cp.id = cr.object_id WHERE $order(date)=$order(now()) and cp.is_down = 1 and cp.status = 1 GROUP BY cp.id ORDER BY total_like desc limit $Page->firstRow, $Page->listRows"); // $data2 = $project->query("select cp.*,SUM(hits) total_like from cmf_project cp left JOIN cmf_ranking cr on cp.id = cr.object_id WHERE cp.is_down = 1 and cp.status = 1 GROUP BY cp.id ORDER BY total_like desc limit $Page->firstRow, $Page->listRows"); // for ($i = 0; $i < $count; $i++) { // $data['pro'][] = array_merge($data2[$i], $data1[$i]); // } // $data['page'] = $Page->show(); // foreach ($ranking as $k => $v) { // $key_id[] = $v['id']; // } // if ($key_id) { // $num = 20 - count($ranking); // $where['id'] = array('not in', $key_id); // $projecting = M('Project')->where($where)->limit(0, $num)->select(); // $data['pro'] = array_merge_recursive($ranking, $projecting); // } else { // $data['pro'] = $project->where($where)->order('post_like desc')->limit(0, 20)->select(); // } // 取出点赞的数量和价格 // $option = M('Options')->where("option_name='site_options'")->find(); // $option01 = json_decode($option['option_value'], true); // $site_like_price = json_decode(htmlspecialchars_decode($option01['site_like_price']), true); // foreach ($site_like_price as $k => $v) { // $like_price[$k] = '赞' . $k . '个(' . $v . '元)'; // } // $this->assign('data', $data); // $this->assign('order', $order); // $this->assign('like_price', $like_price); // $this->display();die; } else { $res = $project->query("SELECT pro.*,IFNULL(cr.total_hit,0) AS total_like FROM cmf_project AS pro LEFT JOIN (SELECT object_id, SUM(hits) AS total_hit FROM cmf_ranking GROUP BY object_id) AS cr ON pro.id=cr.object_id HAVING pro.is_down = 1 AND pro.status = 1 AND pro.stop_time > unix_timestamp() ORDER BY total_like DESC LIMIT $firstRow,20"); } if ($keywords) { $res = $project->query("SELECT pro.*,IFNULL(cr.total_hit,0) AS total_like FROM cmf_project AS pro LEFT JOIN (SELECT object_id, SUM(hits) AS total_hit FROM cmf_ranking WHERE $order(date)=$order(now()) GROUP BY object_id) AS cr ON pro.id=cr.object_id HAVING pro.is_down = 1 AND pro.status = 1 AND pro.stop_time > unix_timestamp() AND pro.p_name like '%$keywords%' ORDER BY total_like DESC"); $count = count($res); } $Page = new \Think\Page($count, 20); // foreach ($res as $k => $v) { // $ids[] = $v['object_id']; // } // $map['id'] = array('in', $ids); // $res2 = $project->where($map)->limit($Page->firstRow . ',' . $Page->listRows)->select(); // foreach ($res2 as $k1 => $v1) { // foreach ($res as $k2 => $v2) { // if ($v1['id'] == $v2['object_id']) { // $res2[$k1]['total_like'] = $res[$k2]['total_like']; // } // } // } // foreach ($res as $k => $v) { // $res2[] = $project->where('id=' . $v['object_id'])->find(); // } // var_dump($res2);die; // $map['id'] = array('in', $ids); // $res2 = $project->where($map)->limit($Page->firstRow . ',' . $Page->listRows)->select(); // foreach ($res2 as $k1 => $v1) { // foreach ($res as $k2 => $v2) { // if ($v1['id'] == $v2['object_id']) { // $res2[$k1]['total_like'] = $res[$k2]['total_like']; // } // } // } // //二维数组排序 // $sort = array( // 'direction' => 'SORT_DESC', //排序顺序标志 SORT_DESC 降序;SORT_ASC 升序 // 'field' => 'total_like', //排序字段 // ); // $arrSort = array(); // foreach ($res2 as $uniqid => $row) { // foreach ($row as $key => $value) { // $arrSort[$key][$uniqid] = $value; // } // } // if ($sort['direction']) { // array_multisort($arrSort[$sort['field']], constant($sort['direction']), $res2); // } $data['pro'] = $res; $data['page'] = $Page->show(); // $count = $project->where($where)->count(); // $Page = new \Think\Page($count, 10); // $data['pro'] = $project->where($where)->order('post_like desc')->limit($Page->firstRow . ',' . $Page->listRows)->select(); // $data['page'] = $Page->show(); // 取出点赞的数量和价格 $option = M('Options')->where("option_name='site_options'")->find(); $option01 = json_decode($option['option_value'], true); $site_like_price = json_decode(htmlspecialchars_decode($option01['site_like_price']), true); foreach ($site_like_price as $k => $v) { $like_price[$k] = '赞' . $k . '个(' . $v . '元)'; } $this->assign(array( 'data' => $data, 'newdata' => $newdata, 'hotdata' => $hotdata, 'order' => $order, 'like_price' => $like_price, )); $this->display(); }
发表回复