让我结合PHP+Mysql完成对需求代码的思路讲解和编写。 
有三个表 
user(用户表) -uid -name -Hp 
mechine(商品表) -mid -name -price 
order(订单表) -oid -mid -uid -time需求:最近一个月,购买商品总价值最高的前10个用户。因为我自己学PHP以后,先是用Laravel框架,后来用的TP框架,思路也比较局限了。 
我给出的是三个表联查,将一个月做为where条件来检索,sum(price)然后根据uid来group聚合 
order(‘num’,desc)思路大概就是三表联查一条语句,面试官没有直接否定我,问了我这样是不是效率和性能都不会很好。 
想请教一下~怎么样能优化的更好。 
自己有想法也会跟进的。

解决方案 »

  1.   

    说一说我遇到过这样问题的面试吧 , 只要遇到自己不是很肯定面试官也不给建议的时候最好自己问问人家的想法 , 我的这个面试官是这么说的 , 连表查询给数据库的压力大 , 三个表每个表单独查询然后使用PHP循环把压力分给PHP ! 仅供参考
      

  2.   

    你的 SQL 指令呢?
      

  3.   

    关系型数据库的强项就是关联查询,自然查询时应该首选
    如要将压力转嫁给 php 的话,那要数据库做什么?
      

  4.   

    我就是 join额外两个表 三个表连起来查的
      

  5.   


    版主大大    前几天处理数据时有个需求自己不会写   百度以后看到您之前回复别人的
    $res = array();
                foreach($data as $val) {
                    if(! isset($res[$val['approval_id']]))
                        $res[$val['approval_id']] = $val;
                    else  $res[$val['approval_id']]['apperson_id'] .= ',' . $val['apperson_id'];
                }
                $res = array_values($res);=-= 能简单给我讲一下不    这个if  和else  的用法  没见到过   不理解阿 
      

  6.   

    三个表单独查询的话  再交给PHP 循环 我还没想明白咋写  我一会儿试试去  谢谢呀
      

  7.   

    mysql与使用什么框架没有关系的。
    你的表结构,索引设计好就可以了。select uid from `order` as a left join mechine as b on a.mid=b.mid where a.time>time()-2592000 group by a.uid order by sum(b.price) desc limit 10;
      

  8.   

         我明白拉   谢谢阿  
    关于mysql   索引 还有 事务这些  表优化方面的 有什么推荐看的书啥的不 ...  都没有实际用过 , 有的使用场景都不知道..然后 有时候用框架用的   原生的感觉都不会写了=-= 
      

  9.   


    版主大大    前几天处理数据时有个需求自己不会写   百度以后看到您之前回复别人的
    $res = array();
                foreach($data as $val) {
                    if(! isset($res[$val['approval_id']]))
                        $res[$val['approval_id']] = $val;
                    else  $res[$val['approval_id']]['apperson_id'] .= ',' . $val['apperson_id'];
                }
                $res = array_values($res);=-= 能简单给我讲一下不    这个if  和else  的用法  没见到过   不理解阿 if...esle...后面只有一行代码,就可以省略花括号了    也可以用  ...?... : ...
      

  10.   

    优化的话    在order表加一个冗余字段price  用空间换时间   这样就变成两表联查了   数据量大的情况下,不建议三表及以上的联查
      

  11.   


    版主大大    前几天处理数据时有个需求自己不会写   百度以后看到您之前回复别人的
    $res = array();
                foreach($data as $val) {
                    if(! isset($res[$val['approval_id']]))
                        $res[$val['approval_id']] = $val;
                    else  $res[$val['approval_id']]['apperson_id'] .= ',' . $val['apperson_id'];
                }
                $res = array_values($res);=-= 能简单给我讲一下不    这个if  和else  的用法  没见到过   不理解阿 if...esle...后面只有一行代码,就可以省略花括号了    也可以用  ...?... : ...
    真的可以用阿!  
      

  12.   

    那应该咋整

    微 jip0303   具体聊
      

  13.   

    user(用户表) -uid -name -Hp 
    mechine(商品表) -mid -name -price 
    order(订单表) -oid -mid -uid -time -price(需要保存订单表, 不然产品改价格, 你怎么玩???)select   o.uid, sum(o.price ) sprice  from `order` o left join user u on u,uid=o.uid left join mechine m on m.mid=o.mid
    group by o.uid然后排序什么的,(sql 不完善,可能有错, 自行补充下吧)
    如果 很多的话,  你要取前10条,可以先提取 订单最多的1000个客户的id, 在group by,  查询,  虽然不太准确, 但是可以提高速度, 1000个uid group 速度应该不会太坑, (有几百万上千万用户的话)