手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:group

一句可以围观的SQL

窝窝(Walkerlee)最近说他折腾了一个SQL,提升了他的工作效率。表示要到博客来投稿,今天我把这个SQL放出来了。
嗯。我总不能说,因为我确实会这个SQL就断了他投稿的心,否则他会砍我的。

前因:
数据库结构如下:

要求:一句SQL实现,分别统计type1,2,3,4 一共多少money (group by uid)

原先做法:分开查询 然后用php合并结果,如

SQL代码
  1. select sum(money) form test where type = 1 group by uid  
  2. select sum(money) form test where type = 2 group by uid  
  3. select sum(money) form test where type = 3 group by uid  
  4. select sum(money) form test where type = 4 group by uid  

现在要求一句SQL。
窝窝问我的时候,我说if(a,b,c)这个函数可以解决,于是他很愤怒。。。。
贴出了最终的SQL语句:

SQL代码
  1. SELECT  
  2. uid,  
  3. SUM( IF(`type`=1, money, 0 ) ) AS `BuyByCash`,  
  4. SUM( IF (`type`=3, money, 0 ) ) AS `BuyByCard`,  
  5. SUM( IF( `type` IN (1,3), money, 0 ) ) AS `BuyByCashAndCard`,  
  6. SUM( IF(`type`=2, money, 0 ) ) AS `SellByCash`,  
  7. SUM( IF(`type`=4, money, 0 ) ) AS `SellByCard`,  
  8. SUM( IF( `type` IN (2,4), money, 0 ) ) AS `BuyByCashAndCard`,  
  9. SUM(money) AS `Amount`,  
  10. COUNT(*) AS `DataNums`  
  11. FROM `test`   
  12. group by `uid`  

窝窝比较郁闷,因为以前处理起来很麻烦,而现在一句就解决了。


此事完结后,他又介绍了一个小技巧:
我有一个relation表,用来存储订单下面的游客

SQL代码
  1. ALTER TABLE `travel_order_customer_relation`  
  2.   ADD CONSTRAINT `travel_order_customer_relation_ibfk_1` FOREIGN KEY (`oid`) REFERENCES `travel_orders` (`id`) ON DELETE CASCADE

然后我用了一个外键,这样order被删除时候,这个关系表里面的相关数据也就自动删除了
----
然后我也很郁闷的说,我的数据表不是INNODB的,所以这个功能我不能用。。。也很纠结

Tags: mysql, group, sum, if