Submitted by gouki on 2010, September 29, 10:19 PM
现在,懒得排版了。
遇到这个问题,从A表往B表导数据,初始SQL是这样的:
SQL代码
- REPLACE INTO shopnc_member_extend (member_id,sell_product_count)
- SELECT ug.uid,count(uid)
- FROM uchome_goods ug
- GROUP BY ug.uid
由于member_id不是主键,于是传说中的Replace删除数据的情况就出现了(replace在更新不是主键的时候,但某数据是唯一索引时,其实它是删除该数据,再insert,这时候如果你只是更新一两个字段,那么其余的字段就会变成默认值)。所以,该方法被我否决。但因为我只要更新一个字段,所以我想着用update,开始的时候,怎么也想不出,后来卫斯文和我说,用insert ignore into吧。于是把replace into 换成了 insert ignore into进行测试,结果是0 rows affected。
怎么办,问了一下锅巴哥哥,他说:用ON DUPLICATE KEY UPDATE吧,于是到mysql官方上找了一下资料,google搜索mysq on duplicate,第一条就是官方手册,我这里就不贴链接了,但我事实上没有看太懂。。这时候卫斯文也说用ON DUPLICATE KEY UPDATE。然后给了一个例子:
SQL代码
- INSERT INTO music_top_filtration (`sid`, `type`, `count_num`)
- SELECT sid,TYPE,count_num
- FROM music_top_version_day20100623 AS a
- LIMIT 1
- ON DUPLICATE KEY UPDATE music_top_filtration.count_num = music_top_filtration.count_num + VALUES(count_num)
虽然功能能不太一样,但已经有点差不多了,他对此sql的解释是:sid+type 为唯一索引,如果唯一索引重复则更新count_num字段。也就是说,我上面的例子其实是可以用这个insert into来实现的,因为member_id虽然不是主键,但它是唯一索引。
然后我就尝试着写update,写出了这样的语句:
SQL代码
- UPDATE shopnc_member_extend as sme , uchome_goods as ug SET sme.sell_product_count = (select count(*) from uchome_goods as uug where uug.uid=sme.member_id)
- WHERE sme.member_id=ug.uid;
执行下来,没问题,只是这个花费的时间啊,超多。。。正在思考的过程中,ThinkinLamp群中的newone又给了个例子,那就是用临时表,当时他写的SQL是这样的:
SQL代码
- update user set roleno=(select count(*) from user_has_roles where user_has_roles.member_id=user.member_id)
和我的SQL差不太多,然后他优化了一下,就成了这句(采用了临时表):
SQL代码
- update user a, (select count(*) as no,member_id from user_has_roles group by member_id) b set a.roleno=b.no where (a.member_id=b.member_id)
于是,参考newone写的sql,我最终的sql就成了:
SQL代码
- UPDATE shopnc_member_extend as sme ,( SELECT seller_id, count( * ) as cnt FROM `shopnc_product_sold` GROUP BY seller_id HAVING seller_id IS NOT NULL ) as tmp
- SET sme.sale_score = tmp.cnt
- WHERE sme.member_id = tmp.seller_id ;
执行了一下,速度刷刷的。只有0.x秒,oh yeah 。
其间,锅巴哥哥威胁我,要我参加他的mysql高级培训班,在此先鄙视一下。
Baby | 评论:0
| 阅读:16606
Submitted by gouki on 2009, March 12, 9:42 AM
phpChina虽然我不是很喜欢,因为论坛里的斗争搞得象国外的党派斗争一样,几乎沦为口水娃了。
但是,他上面的专题还是很不错的。
专题网址如下:http://www.phpchina.com/html/thematic.html
打开任意一个专题,右侧都有专题列表,我复制过来了。希望对大家有用吧。。(其实是对自己有用)
Tags: lamp, phpchina, 专题
PHP | 评论:0
| 阅读:18451
Submitted by gouki on 2009, February 5, 10:19 PM
在线截图,对于PHP来说是有一点难度的,但也并非不可完成
从PHP5开始,为windows平台提供了两个现成的函数,但也只能在windows平台下使用,这两个函数其实还是使用了IE浏览器来进行截图,在使用这两个函数的时候,你可以明显看到IE会一闪而过。
不过在非windows平台下,就没有办法使用了。
为了实现这些功能,网上有很多例子哦,有使用mozilla核心的,有使用XXX核心的,但确实是没有一种完美的实现方案。
自己想想还有一种就是利用flash截图,然后生成图片的方案。这种的话就无所谓在哪个平台下面了吧?
网上有一些在线截图的:
http://snapcasa.com
http://webthumb.bluga.net
但没有一款是PHP的。不过,正所谓事情都是人想出来的,我既然不能使用PHP截图,但是我可以利用这些网址截好图,用PHP抓回来嘛。。
黑黑
Tags: 截图, snapshot, webcatch
PHP | 评论:1
| 阅读:20520
Submitted by gouki on 2008, October 11, 11:01 PM
懒得写上什么,apache的rewrite一向是最让人头疼的。这是我几年前找的文章,继续转贴一下,毕竟以前的BLOG我也不知道能够被保留多久, 这个毕竟是自己的,只要没啥意外,会一直保留着的。
收藏自:竹笋炒肉
» 阅读全文
Tags: 转贴, apache, rewrite, 解释
Software | 评论:0
| 阅读:25030
Submitted by gouki on 2008, July 30, 8:42 PM
刚才打开google reader的时候,突然看到一篇文章,让俺大吃一惊呀。详细内容如下:
原文网址:http://www.cnblogs.com/xinerzhui/archive/2008/07/30/1256648.html
- 请谨慎注意这一微软SQLBug
- 刚来博客园,有什么不对,需要改进的地方,欢迎各位同道指出来,谢谢。
- 今天在使用数据库时出现意外操作,将一张表的数据删除了。仔细查看SQL语句,发现问题。将问题类推到Northwind中。我们使用两个表,Employees和Products
- SQL语句如下:
- select * from Products where CategoryID in (select CategoryID from Employees)
- 不看表结构是看不出什么问题的,不清楚的看一下表结构。执行上面的SQL语句,你将能看到所有的产品记录。
- 当你执行上面语句的"select CategoryID from Employees",将会提示一个错误提示:
- 消息 207,级别 16,状态 3,第 1 行
- 列名 'CategoryID' 无效。
- 表Employees中根本就没有CategoryID列,而微软忽略了括号中的错误,执行前面的语句。如果是应用在删除,更新,那后果将是不可现象的。我曾为此付出了代价。
- 这个应该就是微软SQL的BUG吧,我们需要特别注意。
- 在SQL2000企业管理器,SQL2000的查询分析器,SQL2005的Management Studio Express中均有此Bug。
然后有人回复为:
#2楼 2008-07-30 17:21 | 熊呜呜
我在Sql2000上测试,确实有这个问题。
#3楼 2008-07-30 17:27 | ocean
- 有意思的问题,在我的management studio里面查询,也会有这个问题,要好好地研究一下。
#7楼 117.22.68.*2008-07-30 17:45 | johnnyshieh [未注册用户]
- Microsoft SQL Server Management Studio 9.00.1399.00
- 有楼主说的问题!
- 确实应该注意一下。
#9楼 2008-07-30 17:55 | 金色海洋(jyk)
- 看了表结构才知道,Employees 表里面没有 CategoryID字段。为什么不报错呢。错误被吃掉了。
-
- select * from Products where CategoryID in (select CategoryID from Employees)
-
- select * from Products where CategoryID in (select EmployeeID from Employees)
-
- 我比较了一下这两个语句的执行计划,不完全一样。建议lz分析一下执行计划。
- 因为我还不能完全看懂执行计划。只能看出来两个执行计划是不一样的。呵呵。
在MYSQL里没有试会不会遇到这种情况,我用navicat试是没有这种情况的。不知道其他的会不会有。
联想起以前写CRUD之类的东西时候,在过滤条件时,自动将空值直接unset掉,然后再拼成SQL,后来被BOBBY严厉批评了一下,确实,查询的时候感觉不出有什么问题,可如果是在UPDATE或者是DELETE的时候呢?本来是有条件的,可突然被unset掉成为没有条件了,那岂不是很恐怖?
借这个机会再次提醒自己,细心、周全、小心
Tags: mssql, sqlserver, microsoft, sql, bug
Baby | 评论:0
| 阅读:21672