比如这个sql语句
$sql='select n.*,c.* from tb_news as n left join tb_news_cate as c on(n.cateid=c.cateid) order by id desc limit 0,5';
要怎么拆,感觉left join效率不是很高
但是也有人说这样比拆出来效率高
那先不说效率,这个要怎么拆

解决方案 »

  1.   

    select * from tb_news where cateid in ( select cateid from tb_news_cate ) order by id desc limit 0,5
      

  2.   

    你才说只要拆分不管效率要论效率当然是left join高过in这样的条件查询关键是你的条件是不固定的,只能用in这样的范围查询
      

  3.   

    你总要先满足你的需求,再考虑优化吧?
    左连接
    select n.*,c.* from tb_news as n left join tb_news_cate as c on(n.cateid=c.cateid) order by id desc
    结果集中包含表 tb_news 的全部记录,表 tb_news_cate 中不满足连接条件的记录,在记录集中为 NULL右连接
    select n.*,c.* from tb_news as n right join tb_news_cate as c on(n.cateid=c.cateid) order by id desc
    结果集中包含表 tb_news_cate 的全部记录,表 tb_news 中不满足连接条件的记录,在记录集中为 NULL内连接
    select n.*,c.* from tb_news as n inner join tb_news_cate as c on(n.cateid=c.cateid) order by id desc
    结果集中包含表 tb_news 和表 tb_news_cate 中满足连接条件的记录一称为逗号连接
    select n.*,c.* from tb_news as n, tb_news_cate as c where n.cateid=c.cateid order by id desc
    #1 的称为子查询,效果与内连接一样
      

  4.   


    left join效率高些?
    需要多表的话,没有比left join更高效的方法了吗
      

  5.   

    你考虑到表的索引啊...
    一般我是偏好left join...
      

  6.   


    如果是这样的话,可以写作
    select n.*,c.* from (select * from tb_news order by id desc limit 0,5) as n left join tb_news_cate as c on(n.cateid=c.cateid)即只用表 tb_news 的5条记录参与连接,应该很高效了