BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / database / #10488同步于 2017/6/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖

求一个SQL,想了下感觉好像不是太会写

GOON
2017/6/8镜像同步11 回复
2张表device order; 每完成一个订单,会插入数据到order表里,记录一些数据,包括device_id,时间,状态(已支付)等……(没有订单就不插入数据到order表) device 表里面就是一些设备信息。 需要的结果是: 展示(一段时间内),每一天,有哪些设备没有订单; 举例子:今天设备 abc 没有订单 昨天bd没有订单 2017-06-08 a,b,c 2017-06-07 b,d 我怕是需要一发特殊的join技巧了。。。。 --—————————————————— 更新一个版本: 求某一天设备差集 这个没有问题,总结出来了三种: 1, device d left out join order o on d.id =o.device_id where order.id is null 2, find_in_set 方法 3,not in | not exists 现在纠结的问题是->把数据按天聚合: select date_format(updated_at, '%Y-%m-%d') as days group by days ———————————— 我希望我说明白了
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
specops机器人#1 · 2017/6/8
。。。你需要的是except
GOON机器人#2 · 2017/6/8
学习了一下这个关键感觉是我需要的但是…… SELECT NAME FROM FOOTBALLFANS EXCEPT SELECT NAME FROM BASKETBALLFANS 这个类型的代码在mysql work bench上跑不起来 我没找到比较好的办法。 然后尝试了一下LEFT JOIN where order_id is null 这个能查出来某一天但是仍有缺陷 【 在 specops 的大作中提到: 】 : 。。。你需要的是except
specops机器人#3 · 2017/6/8
[ema2]那就很悲伤了。。。其他方法我就不会了。。。。如果数据量不大全弄出来再处理也可以吧 【 在 GOON (Mr_GO_昂) 的大作中提到: 】 : 学习了一下这个关键感觉是我需要的但是…… : SELECT NAME FROM FOOTBALLFANS : EXCEPT : ...................
Cabbage机器人#4 · 2017/6/8
查了一下mysql的聚合函数,最后终于试出一个可行的方案 ``` select time, GROUP_CONCAT(device_id) as device_list from ( select time, GROUP_CONCAT(device_id) as device_list from `order` group by time )`tmp`, `device` where FIND_IN_SET(device_id, device_list) = 0 group by time ```
Cabbage机器人#5 · 2017/6/8
楼主看看是否可行[ema0]
GOON机器人#6 · 2017/6/9
尝试了一下,并没有得出预期的效果 需要的device_id from table_device where find_in_set(device_id,device_list)=0 而这个device_list 需要的是卖出去的设备id, 就是找出在设备表里面而不在卖出去的设备里面的数据。 以上确实是可以实现,没有问题。 问题在于这个deivce_list要求是一个字符串,不能有多行。。。 因为我需要一个group by date_format(updated_at, '%Y-%m-%d') 这个就翻车了 我去跟pm 说下不这么实现或者……另外加一张设备销量表。。。。。。。。 【 在 Cabbage 的大作中提到: 】 : 楼主看看是否可行
Cabbage机器人#7 · 2017/6/9
没懂,device_list是用GROUP_CONCAT返回的,不就应该是一个字符串嘛,不会多行吧 加一个group by date_format(updated_at, '%Y-%m-%d')就翻车?[ema9] 【 在 GOON 的大作中提到: 】 : 尝试了一下,并没有得出预期的效果 : 需要的device_id from table_device where find_in_set(device_id,device_list)=0 : 而这个device_list 需要的是卖出去的设备id, : ...................
GOON机器人#8 · 2017/6/9
啊呀,头皮发麻,我要的是个字符串,没有错。 但是我需要这个字符串和day有联系,也就是每天(saled device list)他是个动态变化的 上错误代码 妈蛋 子查询里的时间和父查询里面的时间不能联动 ``` select count(distinct sn) as unsale, date_format(o.updated_at, '%Y-%m-%d') as days from device d, order o where find_in_set(id, ( select GROUP_CONCAT(distinct device_id) from order o where status = 'paid_and_make' ) ) = 0 and o.updated_at > '2017-05-29' AND o.updated_at < '2017-06-01' ; ``` 【 在 Cabbage 的大作中提到: 】 : 没懂,device_list是用GROUP_CONCAT返回的,不就应该是一个字符串嘛,不会多行吧 : 加一个group by date_format(updated_at, '%Y-%m-%d')就翻车? :
Nroskill机器人#9 · 2017/6/9
SELECT id FROM device where id not in (SELECT DISTINCT device_id FROM order where date = '2017-06-04') 这个应该可以查出具体某一天的,如果要是很多天的话我再想想,在吃饭 不方便查东西 发自「贵邮」