返回信息流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
————————————
我希望我说明白了
这是一条镜像帖。来源:北邮人论坛 / database / #10488同步于 2017/6/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖
求一个SQL,想了下感觉好像不是太会写
GOON
2017/6/8镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
学习了一下这个关键感觉是我需要的但是……
SELECT NAME FROM FOOTBALLFANS
EXCEPT
SELECT NAME FROM BASKETBALLFANS
这个类型的代码在mysql work bench上跑不起来 我没找到比较好的办法。
然后尝试了一下LEFT JOIN where order_id is null
这个能查出来某一天但是仍有缺陷
【 在 specops 的大作中提到: 】
: 。。。你需要的是except
[ema2]那就很悲伤了。。。其他方法我就不会了。。。。如果数据量不大全弄出来再处理也可以吧
【 在 GOON (Mr_GO_昂) 的大作中提到: 】
: 学习了一下这个关键感觉是我需要的但是……
: SELECT NAME FROM FOOTBALLFANS
: EXCEPT
: ...................
查了一下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
```
尝试了一下,并没有得出预期的效果
需要的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 的大作中提到: 】
: 楼主看看是否可行
没懂,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,
: ...................
啊呀,头皮发麻,我要的是个字符串,没有错。
但是我需要这个字符串和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')就翻车?
:
SELECT id FROM device where id not in (SELECT DISTINCT device_id FROM order where date = '2017-06-04')
这个应该可以查出具体某一天的,如果要是很多天的话我再想想,在吃饭 不方便查东西
发自「贵邮」