解决方案 »

  1.   

    你没弄清楚我说的意思。一个sql应该是查不到我想要的结果的。
      

  2.   

     你没弄清楚我说的意思。我想要的结果,你left join查询的话,那a表的记录机会重复好多。
      

  3.   

    select t.aid,t.aname,t.time,t.desc,t.bid,t.bname,c.id as cid,c.cname from (select a.id,a.aname,a.time,a.desc,b.id as bid,b.bname from a left join b on a.id = b.aid) t left join c on t.bid = c.bid;
    这样全部查出来了,你先执行看看结果,这是最全的数据,然后用代码处理这些数据。处理起来就简单了,如果按照你的结构,那就是几个list的处理。思路就是aid如果已存在,则再list里添加B的信息;若不存在,就new一个A对象,然后重复前一步(b和c的处理也是一样)。这种处理再实际项目中太多了,你这个需求目测处理代码不超过20行。绝对不要按照你的想法来回查几次库,每请求一次库的性能消耗太大,设计时候要尽可能减少对库的连接。
      

  4.   

    小哥,你又跑这来给人讲sql啦!那啥,我那个设计模式的帖子您看可以结了不?木人回应你啊!http://bbs.csdn.net/topics/390971281?page=2#post-398818527哦,对了,我木有实际项目经验啊,可是貌似你给的介个用代码处理的方案也有点儿草率吧(我擦,我是不是又有逻辑问题啦?又不会和人讨论了是吧?)。您好歹得问客户一句:打算肿么显示数据啊?数据量有多大啊?“每请求一次库的性能消耗太大,设计时候要尽可能减少对库的连接”,这是你们组长教你的吗?
      

  5.   

    我也是真心看不懂,原来你不懂数据库啊?如果你这么看不起数据库,只敢读一次,然后啥都放内存里,那这个世界上最牛B的数据库应该是memcache啊!连redis都偷偷往硬盘上存东西啊!redis你揍不用了吧?像你说的“性能消耗太大”啊!克隆一下你的话:几个i/o揍把你吓尿啦!你们SAP不做分层显示数据啊?不做分层,分页做不做?你不总号称10w数据量吗?还啥real-time, 那都一次读到内存里啊?表A,B,C在页面加载时,哪个需要显示,哪个不需要?是A中的行全显示,还是分页?B,C表中数据有多少?一个典型用户可能查看多少个A records?假设只需要A列表,B,C中数据很多,那完全木有必要query所有的数据。只当A的一个record被用户点击时,再加载相应的B,C(你只会在hibernate里用lazy load是吧?)。这样数据库查询的压力不一定有你想象的那么大,也许比一次load所有更快。因为这样的query首先范围小很多,而且都是hit在索引上!还有,就算必须一次都读出来,你给的那个sql也貌似有问题啊!sql是我最差的skill,我试着给你分析一下啊select t.aid,t.aname,t.time,t.desc,t.bid,t.bname,c.id as cid,c.cname from (select a.id,a.aname,a.time,a.desc,b.id as bid,b.bname from a left join b on a.id = b.aid) t left join c on t.bid = c.bid;from后面的那个select,你取了这么多东东, 然后再和C做left join,你知道这样可能有多慢吗?既然是临时表,就应该尽量避免去做disk i/o, 只取索引项就够了!为毛?因为索引有可能还在内存里!内存比硬盘快几个数量级?!自己试着改一下,然后run一个explain,回来告诉大家我说的对不对啊!
    呵呵 真心不想回你,你们的东西都是请求N次库么?数据都出来了,你放缓存也好,直接显示也好,客户要什么你处理成显示什么不就完了,有任何关系?不要在这里秀下限了好么?
      

  6.   


    呵呵 真心不想回你,你们的东西都是请求N次库么?数据都出来了,你放缓存也好,直接显示也好,客户要什么你处理成显示什么不就完了,有任何关系?不要在这里秀下限了好么?恩 说的有道理。数据是要一次性查询出来。目前的处理方式,是用hibernate的立即加载