窝窝(Walkerlee)最近说他折腾了一个SQL,提升了他的工作效率。表示要到博客来投稿,今天我把这个SQL放出来了。
嗯。我总不能说,因为我确实会这个SQL就断了他投稿的心,否则他会砍我的。
前因:
数据库结构如下:
要求:一句SQL实现,分别统计type1,2,3,4 一共多少money (group by uid)
原先做法:分开查询 然后用php合并结果,如
SQL代码
- select sum(money) form test where type = 1 group by uid
- select sum(money) form test where type = 2 group by uid
- select sum(money) form test where type = 3 group by uid
- select sum(money) form test where type = 4 group by uid
现在要求一句SQL。
窝窝问我的时候,我说if(a,b,c)这个函数可以解决,于是他很愤怒。。。。
贴出了最终的SQL语句:
SQL代码
- SELECT
- uid,
- SUM( IF(`type`=1, money, 0 ) ) AS `BuyByCash`,
- SUM( IF (`type`=3, money, 0 ) ) AS `BuyByCard`,
- SUM( IF( `type` IN (1,3), money, 0 ) ) AS `BuyByCashAndCard`,
- SUM( IF(`type`=2, money, 0 ) ) AS `SellByCash`,
- SUM( IF(`type`=4, money, 0 ) ) AS `SellByCard`,
- SUM( IF( `type` IN (2,4), money, 0 ) ) AS `BuyByCashAndCard`,
- SUM(money) AS `Amount`,
- COUNT(*) AS `DataNums`
- FROM `test`
- group by `uid`
窝窝比较郁闷,因为以前处理起来很麻烦,而现在一句就解决了。
此事完结后,他又介绍了一个小技巧:
我有一个relation表,用来存储订单下面的游客
SQL代码
- ALTER TABLE `travel_order_customer_relation`
- ADD CONSTRAINT `travel_order_customer_relation_ibfk_1` FOREIGN KEY (`oid`) REFERENCES `travel_orders` (`id`) ON DELETE CASCADE;
然后我用了一个外键,这样order被删除时候,这个关系表里面的相关数据也就自动删除了
----
然后我也很郁闷的说,我的数据表不是INNODB的,所以这个功能我不能用。。。也很纠结