注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 DOS命令杀掉进程
 帮助

一点用LEFT JOIN的教训


2008-01-24 17:55:48
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://wfyang.blog.51cto.com/65117/60588
从前,有这样一个sql:
SELECT v.*,v2s_subject,v2s.v2s_vid, s.s_views FROM video2sites v2s
    LEFT JOIN videos v USING(v_id)
    LEFT JOIN stats s USING(v2s_id)
    WHERE m_id='$uid' AND v_censor IN(2,3,4) GROUP BY v.v_id
它一直工作得很正常,但有一天,它突然报错了。

报的错是说不能确定v2s_id,仔细检查一下,原来是videos表中为了查询方便也加入了一个“v2s_id”字段,using就傻了。

抛开数据库设计的因素不谈,其实这样的问题是可以避免的。方法很简单,就是用“ON”来代替“USING”。相信很多人像我一样,写程序的时候能少写一点就少写一点,这样做的后果就是往往会带来一些莫名其妙的麻烦。

改过之后的sql是这样的:
SELECT v.*,v2s_subject,v2s.v2s_vid, s.s_views FROM video2sites v2s
    LEFT JOIN videos v ON v.v_id= v2s.v_id
    LEFT JOIN stats s ON s.v2s_id=v2s.v2s_id
    WHERE m_id='$uid' AND v_censor IN(2,3,4) GROUP BY v.v_id
这么写虽然麻烦了些,但起码可以保证在某个表中添加字段的时候不会引起冲突。

本文出自 “wfyang” 博客,请务必保留此出处http://wfyang.blog.51cto.com/65117/60588





    文章评论
 
2008-01-25 09:23:37
恩 以后可要吸取教训啊

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: